Модель 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, у вас будет только таблица соединения, а не модель, которая не будет контролироваться.

Другие вопросы по тегам