活动记录关联:has_one:通过?或者多个has_one's?

时间:2010-05-03 02:22:55

标签: ruby-on-rails activerecord

我是Rails的新手,所以请耐心等待。

我有3个模型:User,Section和Tick。

每个部分都是由用户创建的。我猜这个联想:

class Section < ActiveRecord::Base
  has_one :user
end

接下来,每个用户都可以“勾选”一个部分 - 只有一次。因此,对于每个tick,我有一个section_id,user_id和timestamps。这就是我被困的地方。这是否需要“has_one:through”关联?如果是这样,哪个方向?如果没有,那我就走了。

哪个协会在这里工作?

谢谢!

3 个答案:

答案 0 :(得分:1)

class User < AR::Base
  has_many :ticks
  has_many :sections, :through => :ticks
end

class Section < AR::Base
  has_many :ticks
  has_many :users, :through => :ticks
end

class Tick < AR::Base
  belongs_to :user
  belongs_to :section
  validates_uniqueness_of :user_id, :scope => :section_id
end

现在,要查找用户勾选的部分,请执行user.sections,或查找勾选某个部分的所有用户section.users

这里有一个多对多关系(用户可以有很多部分,一个部分可以属于许多用户),因此这需要一个连接模型来关联它们。在这种情况下,Tick模型充当连接模型。

答案 1 :(得分:1)

这应该是对的:

class User < AR::Base
  has_many :sections   #user can have many sections
  has_many :ticks, :through => :sections   #user has many ticks, but the left outer join goes through sections
end

class Section < AR::Base
  belongs_to :user  #each section belongs to 1 user
  has_many :ticks   #each section can have a tick, because of can use has_many
end

class Tick < AR::Base
  belongs_to :section  #a tick belongs to a section
  has_one :user, :through => :sections   #belongs_to :through does not exist, use has_one through
end

答案 2 :(得分:0)

尝试以下

class Tick < ActiveRecord::Base
  belongs_to :user
  belongs_to :section
  validates_uniqueness_of :user_id, :scope => :section_id #There is only one user per section
end

参考This