Я столкнулся с этой странной проблемой на работе, поэтому я создал минимальное приложение, чтобы выделить проблему. У меня есть две модели с простой ассоциацией:
class Parent < ActiveRecord::Base
has_many :children
end
и
class Child < ActiveRecord::Base
belongs_to :parent
named_scope :only_adults, :conditions => "adult is true"
end
Теперь, когда я делаю
p = Parent.first
p.children.only_adults.all()
Я ожидаю, что рельсы сгенерируют один SQL-запрос, содержащий все условия. Однако вот что я вижу в журнале:
Child Load (0.5ms) SELECT * FROM "children" WHERE ("children".parent_id = 1)
Child Load (0.3ms) SELECT * FROM "children" WHERE ("children".parent_id = 1) AND ((adult is true) AND ("children".parent_id = 1))
Первый запрос в основном бесполезен и может занимать очень много времени в случае больших коллекций.
У кого-нибудь есть идея, почему рельсы так себя ведут?
Обратите внимание, что вместо того, чтобы делать
p.children.only_adults.all()
Я делаю
Child.by_parent(p.id).only_adults.all()
где by_parent
- именованная область, тогда я получаю только один запрос.
Также обратите внимание на дублирование условия parent_id. Это не имеет большого значения.
Спасибо за ваш отзыв.