Модель Rails, принадлежит многим - PullRequest
23 голосов
/ 09 декабря 2010

Мне трудно понять, как связать одну из моих моделей с множественной другой.

Как сейчас, у меня есть:

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 ]

46 голосов
/ 09 декабря 2010

Отношения многие-ко-многим в рельсах не используют 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

Я надеюсь, что этопоможет, и свяжитесь со мной, если у вас есть какие-либо вопросы!

29 голосов
/ 09 декабря 2010

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

...