通过子对象的最大字段值查找ActiveRecord对象?

jus*_*ese 28 activerecord ruby-on-rails

如何找到与ActiveRecord计算结果相关联的对象而不是值?

例如,我有@parent有很多孩子.我想找到具有最大'价值'的孩子.

我知道我可以做@ parent.children.maximum(:value),但这会返回最大值.是否有类似于maximum和minimum的方法返回整个对象而不是值,以便我可以使用最大对象中的不同字段?

fl0*_*00r 54

@parent.children.order("value DESC").first
Run Code Online (Sandbox Code Playgroud)

  • 对于AR对象,`first`为`last`将向sql添加`limit 1`.你可以尝试一下:`@ parent.children.order("value DESC").first.to_sql` (7认同)
  • @Alehar如果你在这个特定列的数据库中有某种树索引,它将是O(logN).如果你不这样做 - 那么请选择威尔的解决方案.这也会很慢.因此,该解决方案特定于您的数据库设置.通常,如果要进行此类查询,则应向列添加索引. (2认同)

Wil*_*Ayd 26

不确定这是否是最有效的,但是一旦你有了最大值,你可以在哈希中传递它以获得对象

@maxvalue = @parent.children.maximum(:value)
@myObject = @parent.children.where(:value => @maxvalue)
Run Code Online (Sandbox Code Playgroud)


Sir*_*lot 8

通过使用ruby的#max_by,这是我个人最喜欢的可读性:

@parent.children.max_by(&:value)
Run Code Online (Sandbox Code Playgroud)

  • 我无法想象这是最有效的方法,但它对我有用。谢谢。 (2认同)

jem*_*ger 5

@parent.children.first(:conditions => {:value => @parent.children.maximum(:value)})
Run Code Online (Sandbox Code Playgroud)