2009-07-01 3 views
2

В моем Rails 2.3.2 приложенияРельсов жадной загрузка, возможно, ошибка

У меня есть 2 модели:

class Post 
    has_many :approved_comments, :class_name => 'Comment', :conditions => ['approved => ?', true] 
end 

class Comment 
    belongs_to :post 
end 

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

post = Post.find(:first, :conditions => ["permalink=?", permalink], :include => :approved_comments 
 
undefined method `loaded?' for # 

Исходя из association_preload.rb линии 228

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

Я, кажется, нашел небольшую дискуссию об этом на: http://groups.google.com/group/maine-ruby-users-group/browse_thread/thread/796cf58b62f9bc52

+0

Безопаснее использовать хэш для условий:: conditions => {: approved => true} и: conditions => {: permalink => permalink}. Я больше агностик базы данных. – klew

+0

Вы также можете использовать Post.first (: conditions ...) вместо Post.find (: first, ....). А также подумайте об использовании named_scopes для поиска одобренных комментариев. – klew

+0

Спасибо, klew, Ill, помните об этом, я возвращаюсь к некоторым рельсам dev после многолетнего перерыва, поэтому его немного поднять. –

ответ

1

FWIW,

Я думаю, что я, возможно, перепутались здесь, я approved_comments определен дважды в моем классе. Несчастный побочный эффект, который я обнаружил, заключался в том, что страстная загрузка играет с этой фильтрацией и идет влево, чтобы присоединиться к аду. Поэтому я работал над этим, выбирая все и фильтруя код.

0

Вы могли бы попробовать что-то вроде:

class Post 
    has_many :approved_comments, :class_name => 'Comment' 
end 

class Comment 
    belongs_to :post 
end 

, а затем что-то вроде:

Post.find(:all, :joins => :approved_comments, :conditions => ["comments.approved = ? AND permalink = ?", true, permalink], :include => :approved_comments) 

Найдет все сообщения, которые вы хотите, а затем стремятся загружать комментарии к ним. В большом наборе записей я бы рекомендовал против него, хотя он будет медленным и сдует объем памяти вашего экземпляра вашего пассажира/монгрелла.

+0

Да, поэтому я предпочитаю голый: включите, новая нетерпеливая загрузка будет выполнять 2 запроса, с голым включением, один для комментариев и один для сообщения, который гораздо более дружественный к памяти. Это: http://www.samsaffron.com/archive/2008/03/15/You+should+be+very+careful+when+using+ActiveRecord+eager+loading не полностью исправлено –

+0

Возможно, я не поклонник голых включает, поскольку он может очень легко выйти из-под контроля. Вот почему я не возражаю против такого рода вещей, это все еще только 2 вопроса, но он определенно только хочет загружать нужные мне записи, а не загружать все, а затем решать, что ему нужно. – nitecoder