2010-10-19 3 views
0

Я строю приложение рецепт, где пользователь может просматривать рецепты, список ингредиентов, получить список покупок и т.д. и т.п.нескольких объединений в рельсах

Каждый рецепт состоит из этапов, каждый шаг имеет ингредиентов, и каждый У ингредиента есть бакалейная лавка.

я был совершенно уверен, что способ создания этих связей были через модель, так что мои модели выглядят как этот

 
class Recipe < ActiveRecord::Base 
    has_many :steps, :dependent => :destroy 
    has_many :ingredients, :through => :steps 
    has_many :groceries, :through => :ingredients 
end 

class Step < ActiveRecord::Base 
    belongs_to :recipe 
    has_many :ingredients, :dependent => :destroy 
    has_many :groceries, :through => :ingredients 
    accepts_nested_attributes_for :ingredients 
end 

class Ingredient < ActiveRecord::Base 
    belongs_to :step 
    belongs_to :recipe 
    has_one :grocery 
end 

class Grocery < ActiveRecord::Base 
    has_and_belongs_to_many :ingredients 
     has_and_belongs_to_many :steps, :through => :ingredients 
     has_and_belongs_to_many :recipes, :through => :ingredients 
end 

Я могу выводить отладочный @ recipe.steps, @ recipe.ingredients, но @recipe .groceries возвращает

 
uninitialized constant Recipe::Grocery 

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

Контроллер просто

 
def show 
    @recipe = Recipe.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @recipe } 
    end 
    end 

Am я ищу свою ошибку в нужном месте? или я неправильно интерпретирую ошибку?

ответ

4

Я на самом деле написал сообщение в блоге об этом некоторое время назад. Проблема в том, что вы не можете объединять ассоциации has_many :through в Rails. Вот ссылка на мою статью, объясняя это:

http://kconrails.com/2010/01/28/nesting-has_many-through-relationships-in-ruby-on-rails/

Быстрый ответ в том, что вы можете использовать nested_has_many_through плагин, чтобы сделать это. Однако слово осторожности - чем больше вы объединяетесь, тем медленнее и сложнее попадают базы данных. Удачи!

+0

Привет Хайме, извините за задержку в ответе. Я путешествовал, когда я впервые задал этот вопрос, и не работал в течение нескольких дней. Затем, когда я наконец вернулся, я работал над другим проектом. Я только что вернулся к этому. Во всяком случае, да, вы получаете кредит, хотя я надеялся, что есть лучшее решение. Полезно знать об этих ограничениях. – pedalpete

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