我有一个具有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的操作

07-26 00:45