我试图理解什么是has_many :through,何时使用(以及如何使用).然而,我不明白.我试着在谷歌上阅读,但我不理解Rails.

推荐答案

假设你有两个模型:UserGroup.

如果您想让用户属于组,那么您可以这样做:

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

Ruby-on-rails相关问答推荐

在Ruby on rails中,重复访问ActiveRecordModel返回相同的对象:预期行为还是错误?

如何在不触发每次编译的情况下运行`bin/rails测试`?

这种使用on:的语法在 Ruby on Rails 中意味着什么?

别名可能与不同模型的相同别名有许多关联?

rails:防止闪烁消息显示两次

我如何存根 find_each 以在 rails 3 中进行 rspec 测试

Rails,获取模型中的资源路径

通过字符串获取 ActiveRecord 对象的属性

如何让 ActiveAdmin 使用强参数?

将图标添加到 Rails 应用程序

在 Rails 应用程序中处理大文件上传的最佳方法是什么?

form_for 未定义的方法 `user_path'

减go Ruby 中的日期并以分钟为单位得到差异

在 Rails 路由中更改 id 参数

通过get in rails传递参数数组

长期运行项目中的 Rebase Rails 迁移

我是否必须手动卸载所有依赖的 gem?

如何翻译 ActiveRecord 模型类名称?

您将如何解析 Ruby 中的 url 以获取主域?

ruby on rails 如何处理 NaN