Модель Rails, принадлежит многим
Мне трудно понять, как связать одну из моих моделей с несколькими другими.
Как и сейчас, у меня есть:
class ModelA < ActiveRecord::Base
has_many :model_b
end
class ModelB < ActiveRecord::Base
belongs_to :model_a
end
Однако... ModelB должен принадлежать не только одному экземпляру ModelA, но, возможно, трем. Я знаю, что есть has_many: through, но я не уверен, как это будет работать в этом случае. КАЖДЫЙ экземпляр ModelA всегда будет иметь ровно три экземпляра ModelB. Но, как уже было сказано, ModelB может принадлежать не только одному экземпляру ModelA.
2 ответа
Отношения многие-ко-многим в рельсах не используют belongs_to
, Вместо этого вы хотите использовать один из нескольких вариантов. Первый 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
И вам нужно будет добавить дополнительную таблицу соединений в вашу базу данных с такой миграцией:
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
Вы можете видеть, что имя объединяющей таблицы является комбинацией имен двух других таблиц. Таблицы должны быть указаны в алфавитном порядке, как указано выше, и :id => false
должен быть там, так как нам не нужен первичный ключ в этой таблице. Это сломает рельсовую ассоциацию.
Есть также другой, более сложный метод, известный как has_many :through
если вам нужно хранить информацию о самих отношениях. Я написал целую статью, подробно описывающую, как использовать оба метода и когда использовать каждый из них:
Базовые ассоциации многие-ко-многим в Rails
Я надеюсь, что это поможет, и свяжитесь со мной, если у вас есть другие вопросы!
Это то, что использовал @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
Я бы порекомендовал использовать это
# 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
Если вы используете это, у вас будет модель соединения, которая даст вам больший контроль над обработкой категорий и предметов. Но используя то, что предложил @Jaime, у вас будет только таблица соединения, а не модель, которая не будет контролироваться.