Rails:是否可以为has_and_belongs_to_many关联添加额外的属性?

我的意思是,如果我有两个模型,通过has_and_belongs_to_many关联连接,我可以在连接表中为每个关联存储其他数据吗? 也就是说,额外数据不会是任何一个表中单个记录的一部分,而是它们之间的连接。

我的实际模型如下:

class Part  true end class Package < ActiveRecord::Base has_and_belongs_to_many :parts belongs_to :user end 

所以重点是每个部件都有许多包装,每个包装都有不同的部件。 我要添加的是数量。 这不是每个部件的数量,而是每个部件的每个包装的数量。

我在ActiveRecord中找不到如何做到这一点。 如果我没有使用rails / activerecord,我只需要在连接表中添加一个数量列,它将部件与包相关联。 我显然可以在迁移中进行此更改,但是如何使用ActiveRecord访问该值?

简短回答不,你不能与HABTM关系。 它仅用于简单的多对多关系。

您将需要使用has_many:through关系。 在此方案中,您将创建一个连接模型(PartPackage),您可以在其中定义所需的额外属性。

 class Part < ActiveRecord::Base has_many :part_packages has_many :packages, :through => :part_packages has_and_belongs_to_many :assemblies belongs_to :user validates :name, :user_id, :presence => true end class PartPackage < ActiveRecord::Base belongs_to :part belongs_to :package end class Package < ActiveRecord::Base has_many :part_packages has_many :parts, :through => :part_packages belongs_to :user end 

has_many :throughhas_and_belongs_to_many之间存在一个关键区别Rails指南更详细地解释了两个选项之间的差异,但是如果要添加描述关系的数据,则使用has_many :through ,您可以访问加入的模型二。

这就是has_many:通过看起来像: 感谢Rails指南。

实际上,这是可能的。

1)将数量键添加到packages_parts连接表

2)将其添加到零件模型中

 has_and_belongs_to_many :packages, -> { select("packages.*, packages_parts.quantity") } 

现在你可以做part.packages[0].quantity ,例如。

这样做是告诉Rails在获取特定部分的包时获取数量密钥。

(如果你想做package.parts.first.quantity,也可以对你的Package模型做同样的事情 – 只需将它放在Package模型上,用’parts’替换’packages’)

更多信息: https : //ducktypelabs.com/using-scope-with-associations/