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!