ruby-on-rails - many - rails model references
Rieles: ¿es posible agregar atributos adicionales a una asociación has_and_belongs_to_many? (3)
Lo que quiero decir es que si tengo dos modelos, conectados por una asociación has_and_belongs_to_many, ¿puedo almacenar otros datos en la tabla de unión para cada asociación? Es decir, los datos adicionales no serían parte de un solo registro en ninguna de las tablas, sino en lugar de la conexión entre ellos.
Mis modelos actuales son los siguientes:
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
Entonces, el punto es que cada parte está disponible en muchos paquetes, y cada paquete tiene partes diferentes. Lo que quiero añadir es una cantidad. Eso no sería cantidad de cada parte, sino de cada paquete de cada parte.
No puedo encontrar cómo hacer esto en ActiveRecord. Si no estuviera usando rails / activerecord, simplemente agregaría una columna de cantidad a la tabla de unión que relaciona las partes con los paquetes. Obviamente, podría realizar este cambio en una migración, pero ¿cómo accedería al valor utilizando ActiveRecord?
En realidad, esto es posible.
1) Agregue una clave de cantidad a la tabla de combinación packages_parts
2) Agregue esto a su modelo de pieza
has_and_belongs_to_many :packages, -> { select("packages.*,
packages_parts.quantity") }
Ahora puedes hacer part.packages[0].quantity
, por ejemplo.
Lo que esto hace es decirle a Rails que obtenga la clave de cantidad cada vez que obtenga los paquetes para una parte específica.
(También puede hacer lo mismo para su modelo de paquete si también desea hacer package.parts.first.quantity; solo coloque esto en el modelo de paquete, reemplazando ''paquetes'' con ''partes'')
Más información: https://ducktypelabs.com/using-scope-with-associations/
Hay una diferencia clave entre has_many :through
y has_and_belongs_to_many
la guía Rails explica las diferencias entre las dos opciones con mayor detalle, sin embargo, si desea agregar datos que describan la relación, use has_many :through
y puede acceder al modelo que se une a dos.
Esto es lo que has_many: a través de parece:
Respuesta corta no, no puedes con una relación HABTM. Sólo está pensado para relaciones simples de muchos a muchos.
Tendrá que usar un has_many: a través de la relación. En este escenario, creará un modelo de unión (PartPackage) donde puede definir los atributos adicionales que necesita.
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