我有一个具有has_many关系的模型,并有一个范围来确定它是否有任何子级,例如:
scope :with_nomination, :include => [:nomination], :conditions => "nominations.service_id IS NOT NULL"
使用此功能,我可以执行类似
Service.with_nomination
的操作,并接收带有提名孩子的所有服务的列表。问题是,当我在essense中执行类似
Service.select("id, firstName, lastName").with_nomination
ActiveRecord的操作时,会执行SELECT * FROM services
这是非常糟糕的,并且没有利用我很费力地设置的索引。如何改写查询或修改范围以使用.select()命令?
最佳答案
原来是我使用的语法,不可能进行选择,所以它会执行选择*,并且所有其他选择都已被覆盖。
我重新编写了如下范围:
scope :no_nomination, joins("LEFT JOIN nominations ON nominations.service_id = services.id").where("nominations.service_id IS NULL")
# important distinction here, the left join allows you to find those records without children
scope :with_nomination, joins(:nomination).where("nominations.service_id IS NOT NULL")
使用此语法使我可以执行类似
Service.select(:id,:user,:otherfield).with_nomination
的操作