Ruby on rails 什么时候使用“a”;有很多:通过;Rails中的关系?

Ruby on rails 什么时候使用“a”;有很多:通过;Rails中的关系?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我试图了解有多少:通过是什么,何时使用(以及如何使用)。然而,我不明白。我正在阅读Rails 3的入门部分,并尝试用谷歌搜索,但我无法理解 假设您有以下型号: Car Engine Piston 汽车有一个发动机 发动机属于车 发动机有许多活塞 活塞属于发动机 汽车有许多活塞,通过发动机 活塞有一个:汽车,通过发动机 本质上,您是将一个模型关系委托给另一个模型,因此不必调用car.engine.活塞,您只需执行car.活塞就可以说您有两个模型:用户和组 如果希望用户属于组,则可以执行以下操作:

我试图了解
有多少:通过
是什么,何时使用(以及如何使用)。然而,我不明白。我正在阅读Rails 3的入门部分,并尝试用谷歌搜索,但我无法理解

假设您有以下型号:

Car
Engine
Piston
汽车
有一个发动机

发动机
属于车

发动机
有许多活塞

活塞
属于发动机

汽车有许多活塞,通过发动机 活塞
有一个:汽车,通过发动机


本质上,您是将一个模型关系委托给另一个模型,因此不必调用
car.engine.活塞
,您只需执行
car.活塞
就可以说您有两个模型:
用户

如果希望用户属于组,则可以执行以下操作:

class Group < ActiveRecord::Base
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :group
end
这种类型的代码很糟糕,引入这样的更改也很痛苦

有很多:通过
为您提供两个世界中最好的:

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
ActiveRecord连接表
has_many:through
has_和_belient_to_many
关系通过联接表来实现,联接表是表示其他表之间关系的中间表。与联接查询不同,数据实际上存储在表中

实际差异 通过使用
has_和\u belient_to_many
,您不需要主键,您可以通过ActiveRecord关系而不是通过ActiveRecord模型访问记录。当您想要链接具有多对多关系的两个模型时,通常使用HABTM

当您想作为Rails模型与联接表进行交互时,可以使用
has_many:through
关系,包括主键和向联接数据添加自定义列的功能。后者对于与连接行相关但实际上不属于相关模型的数据尤其重要——例如,存储从连接行中的字段派生的计算值

另见 在本报告中,建议内容如下:

最简单的经验法则是,如果需要将关系模型作为一个独立的实体来使用,那么应该设置一个has_many:through关系。如果不需要对关系模型执行任何操作,则可以更简单地设置has_和_-belish_-to_-many关系(不过需要记住在数据库中创建联接表)

如果需要验证、回调或连接模型上的额外属性,则应该使用has_many:town


在这里,我将在
user
模型上添加一个方法来添加组。就像我刚做的编辑一样。希望这有帮助。我明白了,我是否也必须编写
user.groups我有一个与group\u成员身份相同的类,我在使用factory girl时遇到了问题。你能帮我吗?我会使用“has\u many:group\u成员身份”。使用单数将起作用,但user.group\u成员身份将成为集合,而user.group\u成员身份将不起作用。这是一个输入错误。修正。我称之为SACA-ShortAndClearAnswer。在这个例子中,我们有3个模型。如果我们想要3个以上的型号呢?e、 g.医生/患者应用程序,他们可以在其中发送消息。然后用户有一个患者有多个预约有一个对话有多条消息。然后可以使用
当前用户.patient.appointment.last.conversation.messages
检索约会的对话。有没有嵌套的has_multi through这样的东西?实际上我们在这里讨论的是活动记录关系。它是关于SQL查询以及如何获取相关数据的。
user.groups.first.name

# becomes

user.group_memberships.first.group.name
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
def add_group(group, role = "member")
  self.group_associations.build(:group => group, :role => role)
end