2009-12-25 2 views
2

В приложении Rails 2.3.5 я получил что-то вроде следующих моделей:Оптимизация Rails нетерпеливый запрос погрузочные найти все

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

И когда я звоню

Foo.all(:include => :bars) 

я вижу в консоли:

SELECT * FROM "foos" 
SELECT "bars".* FROM "bars" WHERE ("bars".foo_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)) 

со всеми идентификаторами foo в предложении where.

Я думаю, что это не оптимальный запрос, в то время как число идентификаторов может быть большим, и мне нужно предварительно загрузить все «бары». Кроме того, на самом деле у меня нет двух моделей, но их цепочки.

Есть ли способ, чтобы сделать запрос жадной загрузки быть как

SELECT "bars".* FROM "bars" 

, когда я использую найти все?

ответ

4

Это на самом деле оптимизация, на самом деле Rails меняет стратегию запросов, если число идентификаторов становится высоким.

Вы также можете использовать :join вместо использования :include

+0

Посмотрите здесь, а http://akitaonrails.com/2008/5/26/rolling-with-rails-2-1-the-first- full-tutorial-part-2 в разделе «Оптимизированная нетерпеливая загрузка» – khelll

+0

Спасибо, knoopx! Мне пришло в голову, что в нетерпеливой загрузке не должно быть известно, загружаю ли я все строки таблицы, или все foo соответствуют некоторому условию (таким образом, предложение WHERE будет включать в себя не все идентификаторы foo.) Я теперь пытаясь найти, где Rails изменяет стратегию запросов, если число id достигает высокой степени любопытства. khelll, спасибо за ссылку, как хорошо! – khustochka

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

  • Нет связанных вопросов^_^