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

时间:2012-02-23 00:58:20

标签: ruby-on-rails activerecord model has-and-belongs-to-many

我的意思是,如果我有两个模型,通过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访问该值?

3 个答案:

答案 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 :throughhas_and_belongs_to_many之间存在关键区别Rails指南更详细地解释了两个选项之间的差异,但是如果要添加描述关系的数据,则使用{{3并且您可以访问连接两者的模型。

这就是has_many:看起来像: Credit to the Rails guide.

答案 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/