through references rails many has_one has_many has_and_belongs_to_many has example belongs and ruby-on-rails activerecord model has-and-belongs-to-many

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