我的意思是,如果我有两个模型,通过has_and_belongs_to_many关联连接,我可以将其他数据存储在每个关联的连接表中吗?也就是说,额外数据不会是任何一个表中单个记录的一部分,而是它们之间的连接。
我的实际模型如下:
class Part < ActiveRecord::Base
has_and_belongs_to_many :assemblies
has_and_belongs_to_many :packages
belongs_to :user
validates :name, :user_id, :presence => true
end
class Package < ActiveRecord::Base
has_and_belongs_to_many :parts
belongs_to :user
end
所以重点是每个部件都有许多包装,每个包装都有不同的部件。我要添加的是数量。这不是每个部分的数量,而是每个部分的每个包装的数量。
我无法在ActiveRecord中找到如何执行此操作。如果我没有使用rails / activerecord,我只需要在连接表中添加一个数量列,它将部件与包相关联。我显然可以在迁移中进行此更改,但是如何使用ActiveRecord访问该值?
答案 0 :(得分:28)
简短回答不,你不能与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
答案 1 :(得分:14)
has_many :through
和has_and_belongs_to_many
之间存在关键区别Rails指南更详细地解释了两个选项之间的差异,但是如果要添加描述关系的数据,则使用{{3并且您可以访问连接两者的模型。
这就是has_many:看起来像:
答案 2 :(得分:2)
实际上,这是可能的。
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模型上,用&#39替换&#39; packages&#39; ;部分&#39;)
更多信息:https://ducktypelabs.com/using-scope-with-associations/