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

20

我的意思是,如果我有两个模型,通过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个回答

31

简短回答:不行,使用 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

16
has_many :throughhas_and_belongs_to_many 之间存在一个关键区别。Rails指南详细解释了这两个选项之间的区别,但是如果您想添加描述关系的数据,请使用has_many :through,并且您可以访问连接这两个模型的模型。

has_many :through的实现方式如下: Credit to the Rails guide.


1
你用什么程序制作了这样漂亮的轮廓? - MicFin
(我的内部参考编号#485)如何在创建整个记录的同时更新appointment_date,以及如何稍后读取额外属性?我只能通过Appointment.find_by.............来实现,但我希望像patient.appointments.first.appointment_date这样不那么古怪的东西。 - ace
你可以像这样更新 appointment_date 属性:belongs_to :physician, :touch =>:appointment_date。 - hashrocket
@MicFin 他从ror指南中获取了这个信息。 - Mauro

4

实际上,这是可行的。

1)在packages_parts联接表中添加一个quantity键。

2)将其添加到您的Part模型中。

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

现在你可以执行part.packages[0].quantity,举个例子。
这样做告诉Rails当它获取一个特定零件的包裹时,获取数量键。
(如果你想执行package.parts.first.quantity,你也可以在Package模型上放置这个内容,只需将“packages”替换为“parts”即可。)
更多信息请查看:https://ducktypelabs.com/using-scope-with-associations/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接