Подтвердить что ты не робот

Модель Rails, принадлежит многим

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

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

class ModelA < ActiveRecord::Base
  has_many :model_b
end

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end

Однако... ModelB должен принадлежать не только одному экземпляру ModelA, но, возможно, трех. Я знаю, что есть has_many: через, но я не уверен, как это будет работать в этом случае. КАЖДЫЙ экземпляр ModelA всегда будет иметь ровно три экземпляра ModelB. Но, как было сказано ранее, ModelB может принадлежать более чем одному экземпляру ModelA.

4b9b3361

Ответ 1

Связи Many-to-many в рельсах не используют 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

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

Ответ 2

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