through references rails many has_one has_many has_and_belongs_to_many has example belongs and ruby-on-rails ruby-on-rails-3 associations model-associations

ruby on rails - references - Modelo Rails, pertenece a muchos.



rails model references (2)

Me resulta difícil descubrir cómo asociar uno de mis modelos con varios de otro.

Como es ahora, tengo:

class ModelA < ActiveRecord::Base has_many :model_b end class ModelB < ActiveRecord::Base belongs_to :model_a end

Sin embargo ... ModelB debe pertenecer no solo a una instancia de ModelA, sino posiblemente a tres. Sé que hay un has_many: a través, pero no estoy seguro de cómo funcionaría en este caso. CADA instancia de ModelA siempre tendrá exactamente tres instancias de ModelB. Pero como se dijo antes, ModelB puede pertenecer a más de una instancia de ModelA.


Esto es lo que usó @Jaime Bellmyer

# app/models/category.rb class Category < ActiveRecord::Base has_and_belongs_to_many :items end # app/models/item.rb class Item < ActiveRecord::Base has_and_belongs_to_many :categories end

Recomendaría usar esto

# app/models/category.rb class Category < ActiveRecord::Base has_many :category_items has_many :items, :through => :category_items end # app/models/item.rb class Item < ActiveRecord::Base has_many :category_items has_many :categories, :through => :category_items end # app/models/category_items.rb class CategoryItems < ActiveRecord::Base belongs_to :category belongs_to :items end

Si usa esto, tendrá un modelo de unión que le dará más control sobre el manejo de Categoría y Artículo. Pero utilizando lo que @Jaime sugirió, solo tendrá una tabla de unión y no un modelo, que no estará bajo control.


Las relaciones de muchos a muchos en los carriles no se utilizan belongs_to . En su lugar, desea utilizar una de las dos opciones. El primero es has_and_belongs_to_many :

# app/models/category.rb class Category < ActiveRecord::Base has_and_belongs_to_many :items end # app/models/item.rb class Item < ActiveRecord::Base has_and_belongs_to_many :categories end

Y deberá agregar una tabla de unión adicional en su base de datos, con una migración como esta:

class AddCategoriesItems < ActiveRecord::Migration def self.up create_table :categories_items, :id => false do |t| t.integer :category_id t.integer :item_id end end def self.down drop_table :categories_items end end

Puede ver que el nombre de la tabla de unión es la combinación de los nombres de las otras dos tablas. Las tablas deben mencionarse en el orden alfabético como se indica arriba, y el :id => false debe estar allí, ya que no queremos una clave principal en esta tabla. Se romperá la asociación de rieles.

También hay otro método más complejo conocido como has_many :through si necesita almacenar información sobre la relación en sí. He escrito un artículo completo que detalla cómo hacer ambos métodos y cuándo usar cada uno:

Asociaciones básicas de muchos a muchos en carriles

Espero que esto te ayude, y contáctame si tienes alguna otra pregunta!