rails - activerecord ...抓住第一个结果

时间:2009-09-05 16:03:43

标签: ruby-on-rails activerecord

我想从表中获取最新的条目。如果我只是使用sql,你可以做

Select top 1 * from table ORDER BY EntryDate DESC

我想知道是否有良好的积极记录方式 我可以做类似的事情:

table.find(:order => 'EntryDate DESC').first

但似乎会抓取整个结果集,然后使用ruby来选择第一个结果。我希望ActiveRecord能够创建只带来一个结果的sql。

3 个答案:

答案 0 :(得分:9)

您需要以下内容:

Model.first(:order => 'EntryDate DESC')

这是

的简写
Model.find(:first, :order => 'EntryDate DESC')

有关详细信息,请查看firstfind的文档。

答案 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"