我想从表中获取最新的条目。如果我只是使用sql,你可以做
Select top 1 * from table ORDER BY EntryDate DESC
我想知道是否有良好的积极记录方式 我可以做类似的事情:
table.find(:order => 'EntryDate DESC').first
但似乎会抓取整个结果集,然后使用ruby来选择第一个结果。我希望ActiveRecord能够创建只带来一个结果的sql。
答案 0 :(得分:9)
您需要以下内容:
Model.first(:order => 'EntryDate DESC')
这是
的简写Model.find(:first, :order => 'EntryDate DESC')
答案 1 :(得分:1)
在这种情况下,Rails文档似乎非常主观。请注意.first与find(:first,blah ...)
相同自:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263
“先查找 - 这将返回与所用选项匹配的第一条记录。这些选项可以是特定条件,也可以只是一个订单。如果没有匹配的记录,则返回nil。使用Model.find(:首先, * args)或其快捷键Model.first(* args)。“
在base.rb的第1533行(截至9/5/2009)中深入研究ActiveRecord代码,我们发现:
def find_initial(options)
options.update(:limit => 1)
find_every(options).first
end
这会调用find_every,其定义如下:
def find_every(options)
include_associations = merge_includes(scope(:find, :include), options[:include])
if include_associations.any? && references_eager_loaded_tables?(options)
records = find_with_associations(options)
else
records = find_by_sql(construct_finder_sql(options))
if include_associations.any?
preload_associations(records, include_associations)
end
end
records.each { |record| record.readonly! } if options[:readonly]
records
end
因为它正在做一个记录。我不确定:limit是否只是限制它在查询运行后返回的记录数,但它确实看起来那样(不再自行挖掘)。看起来你应该只使用原始SQL,如果你担心这会对性能产生影响。
答案 2 :(得分:0)
可以使用find_by_sql http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002267
table.find_by_sql "Select top 1 * from table ORDER BY EntryDate DESC"