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 :through
和has_and_belongs_to_many
之间存在一个关键区别Rails指南更详细地解释了两个选项之间的差异,但是如果要添加描述关系的数据,则使用has_many :through
,您可以访问加入的模型二。
这就是has_many:通过看起来像:
实际上,这是可能的。
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/