2010-05-03 65 views
0

我是Rails的全新品牌,请耐心等待。活动记录协会:has_one:through?或多个has_one的?

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

每个部分都是由用户创建的。我对这个协会的猜测如下:

class Section < ActiveRecord::Base 
    has_one :user 
end 

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

哪个协会在这里工作?

谢谢!

回答

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 
+0

在您的代码中创建关系的方式反映了关系在用户和打勾之间,并且该部分是将它们结合在一起的部分。不应该是用户和部分是相关的,并且刻度线是将它们绑定在一起的东西吗?至少,这就是我的看法 – Faisal 2010-05-03 08:40:20

+0

我不确定“属于:用户”是否正确 - 我认为它会是“has_one:user”? ......也许我的解释不好。如果我错了或需要重新解释,请纠正我。这看起来像是费萨尔的一个不同的例子......试图找出哪个是正确的。感谢您的帮助!!! – jmccartie 2010-05-03 22:38:31

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

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模型充当联接模型。

+0

感谢。由于需要user_id来创建节,我是否需要在那里创建单独的关联?减:蜱协会?用户has_many:部分,部分has_one:用户? – jmccartie 2010-05-03 22:30:43

+0

嗯,如果你想要一个一对多的关系(用户有很多部分,部分属于一个用户),那么你应该这样做,用户has_many:sections,Section belongs_to:user。我首先明白用户和部分是多对多的。但是如果你想让它们成为一对多,请检查PlanetMaster的答案。 – Faisal 2010-05-04 07:05:42