2016-09-26 2 views
2

Я сбиваю с толку об ассоциации. Я попытался написать код ниже, но рельсы были возвращены мне "undefined method` subs ".Как применять правила ассоциации

def show 
    @product = Product.find(params[:id]) 
    @materials = @product.materials.subs 
    respond_to do |format| 
    format.json { render json: [ @product,@materials ]} 
    end 
end 

Я хочу, чтобы модель продукта относилась к Sub model, и я получаю запись Sub model. Если кто-то знает об этой проблеме, пожалуйста, скажите мне.

class Product < ActiveRecord::Base 
    has_many :product_materials 
    has_many :materials, :through => :product_materials 
end 

class ProductMaterial < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :material 
end 

class Material < ActiveRecord::Base 
    has_many :product_materials 
    has_many :products, :through => :product_materials 
    has_many :material_subs 
    has_many :subs, :through => :material_subs 
end 

class MaterialSub < ActiveRecord::Base 
    belongs_to :material 
    belongs_to :sub 
end 

class Sub < ActiveRecord::Base 
    has_many :material_subs 
    has_many :materials, :through => :material_subs 
end 

ответ

2

@product.materials является массивом, и вы не можете цепи ассоциация по массиву

@product = Product.includes(materials: :subs).find(params[:id]) 
@materials = @product.materials.flat_map(&:subs) 

это будет цикл по материалам и возвратит subs для каждого material

+1

'спросил 1 мин ago', 'ответил 1 мин. назад' - это довольно быстро! –

+1

, который обеспечивает n + 1, использует 'includes' –

+0

Он полностью разрешен. Огромное спасибо!! – johnny

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