【问题标题】:Ruby on Rails has_many relationRuby on Rails has_many 关系
【发布时间】:2015-11-03 23:09:44
【问题描述】:

我从 Ruby on Rails 开始,但遇到了一些困难。

为了提供一些背景信息,我想做的是一个用户可以创建帐户的应用程序,每个帐户都有一个频道,每个频道都有一定数量的视频。

还有一个时间线,每个视频都可以添加视频。所以时间线也有很多视频。

到目前为止,我有以下模型:

class Channel < ActiveRecord::Base
  belongs_to :member
  has_many :videos
end

class Member < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_one :channel
  has_many :timelines
end

class Video < ActiveRecord::Base
  belongs_to :channel
end

class Timeline < ActiveRecord::Base
  belongs_to :member
  has_many :videos
end

如何建立一个视频既属于频道又属于时间线的关系?

我认为最好的方法是创建一个名为 timelinerelation 的新表,其中包含 ID_TIMELINEID_VIDEO 字段,例如对于时间线 1,我有视频 2、3、4,对于时间线 2,我有视频 3、4、5。

所以表格会有:

1 2;
1 3;
1 4;
2 3;
2 4;
2 5;

问题是,我不知道如何在 ruby​​ on rails 中做到这一点。

【问题讨论】:

  • @AbM 所以基本上我应该生成一个新的脚手架,将它们联系起来?我正在考虑这个问题,但我不确定。然后我写了类似于“相应的迁移可能看起来像这样:”的迁移,然后 rake db:migrate ?
  • @AbM 好的,谢谢 :)
  • @AbM 给出答案,如果你愿意,我可以接受

标签: ruby-on-rails


【解决方案1】:

按照您提供的示例,我看到一个视频可以属于多个时间线。如果是这样,您需要设置多对多关系作为大纲here

在您的情况下,您可以通过运行创建一个连接模型,例如 TimelineRelation

rails g model TimelineRelation timeline:references video:references

class Video < ActiveRecord::Base
  belongs_to :channel
  has_many :timeline_relations
  has_many :timelines, through: timeline_relations
end

class Timeline < ActiveRecord::Base
  belongs_to :member
  has_many :timeline_relations
  has_many :videos, through: timeline_relations
end

class TimelineRelation < ActiveRecord::Base
  belongs_to :timeline
  belongs_to :video
end

【讨论】:

    【解决方案2】:

    您不需要额外的桌子。只需将字段timeline_id添加到视频模型并添加另一个belongs_to关系

    【讨论】:

    • 我相信@heisenberg 正在寻找的是多对多关系。在他给出的示例中,视频 3 属于时间线 1 和时间线 2
    猜你喜欢
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多