2015-07-02 2 views
0

Команда, ища некоторую помощь для очень конкретной (новички) ситуации в Rails 4 ассоциации. У нас есть 3 модели:Rails 4 HABTM has_many: через

class Brand < ActiveRecord::Base 
has_many :lines, dependent: :destroy 
has_many :products, through: :lines, dependent: :destroy 
end 

class Line < ActiveRecord::Base 
belongs_to :brand 
has_and_belongs_to_many :products 
end 

class Product < ActiveRecord::Base 
has_and_belongs_to_many :lines 
has_many :brands, through: :lines 
end 

Эта конфигурация хорошо работает при попытке проверить Products под конкретного Brand (или Line), и наоборот: разные Brands (или Lines) для конкретного Product. Однако, когда дело доходит до удаления/уничтожения, возникает проблема. Мы получаем эту ошибку RSpec:

ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection: 
Cannot modify association 'Brand#products' because the source reflection 
class 'Product' is associated to 'Line' via :has_and_belongs_to_many. 

Мы сделали исследование этого исключения, проверяется на Rails API, не повез, примеры, найденные показывают различную конфигурацию модели. Что отсутствует в этом подходе?

Цените свою помощь, ребята!

+0

Как вы пытаетесь получить доступ? –

+0

добавьте немного кода контроллера. –

+0

Раньше я не видел хабтма на сквозном столе. Эта промежуточная модель обычно используется для отслеживания метаданных вокруг ассоциации между двумя другими моделями. Поэтому я предлагаю brand_product как сквозной стол и поддерживаю линию отдельно. – osman

ответ

0

На мой взгляд, это должно быть что-то вроде этого:

class Brand < ActiveRecord::Base 
has_many :lines, dependent: :destroy 
has_many :products, through: :lines, dependent: :destroy 
end 

class Line < ActiveRecord::Base 
belongs_to :brand 
has_and_belongs_to_many :products 
end 

class Product < ActiveRecord::Base 
belongs_to :brand, through: :line 
has_and_belongs_to_many :lines 
end 

И в миграции:

create_table :brands , force: true do |t| 
    t.string :name 
    ... 
    t.timestamps null: false  
end 

create_table :lines , force: true do |t| 
    t.string :name 
    t.belongs_to :brand 
    ... 
    t.timestamps null: false  
end 

create_table :products , force: true do |t| 
    t.string :name 
    ... 
    t.timestamps null: false  
end 

create_table :line_products, force: true, id: false do |t| 
    t.belongs_to :line, index: true 
    t.belongs_to :product, index: true 
end 

Я надеюсь, что это поможет.

+0

эй, спасибо за вашу помощь .. Я также проверил этот вариант, но выглядит как недействительный ... http://stackoverflow.com/questions/7834073/how-to-setup-a-kind-of-belongs- to-through-without-setup-up-a-direct-принадлежит –

+0

ok. Поэтому некоторые вопросы. Сколько брендов имеет определенный продукт? Fn Как вы его используете? '@brand.products << @ product' является целесообразным, если перед ним есть' include' или 'joins'. –

Смежные вопросы