我试图理解什么是has_many :through
,何时使用(以及如何使用).然而,我不明白.我试着在谷歌上阅读,但我不理解Rails.
我试图理解什么是has_many :through
,何时使用(以及如何使用).然而,我不明白.我试着在谷歌上阅读,但我不理解Rails.
假设你有两个模型:User
和Group
.
如果您想让用户属于组,那么您可以这样做:
class Group < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :group
end
如果您想跟踪该关联的其他元数据,该怎么办?例如,用户何时加入组,或者用户在组中的角色是什么?
这是使关联成为第一类对象的地方:
class GroupMembership < ActiveRecord::Base
belongs_to :user
belongs_to :group
# has attributes for date_joined and role
end
这将引入一个新表,并从用户表中删除group_id
列.
这段代码的问题是,您必须在使用user类的其他地方更新并更改它:
user.groups.first.name
# becomes
user.group_memberships.first.group.name
这种类型的代码很糟糕,引入这样的更改很痛苦.
100让你两全其美:
class User < ActiveRecord::Base
has_many :group_memberships
has_many :groups, :through => :group_memberships # Edit :needs to be plural same as the has_many relationship
end
现在你可以像对待普通的has_many
一样对待它,但是当你需要它的时候,你可以得到关联模型的好处.
请注意,您也可以使用has_one
.
Edit: Making it easy to add a user to a group
def add_group(group, role = "member")
self.group_associations.build(:group => group, :role => role)
end