Rails:查找表中最旧的项目

时间:2015-08-28 21:57:24

标签: ruby-on-rails datetime activerecord

我正在尝试找到一种方法来获取最旧的created_at值以获取类中最旧的对象,所以我以后可以操作它。

我正在尝试将所有项添加到数组中,然后获取最旧的值,然后使用.where活动记录方法将其转换回来以获取在该日期创建的对象。

这是我到目前为止所做的:

date_array=[]
      buy_requests.each do |buy_request|
        date_array << buy_request.created_at
      end
      date_array.min

但我觉得有更简单的方法可以做到这一点。

关于我遇到的问题是,当我将数据添加到数组时,我不再有时间创建它,因此我不能再使用.where一旦我使用.min获得最早的日期。< / p>

谢谢。如果我不够清楚,请告诉我。

4 个答案:

答案 0 :(得分:4)

没有必要获得最早的时间戳,然后是相应的对象,只需:

id

...将受益于created_at上的索引,或者可能......

BuyRequests.order(:created_at).limit(1)

...如果您的身份证明是以先到先得的顺序可靠分配的。

您可能希望在相同的created_at时间戳上打破平局:

BuyRequests.first

答案 1 :(得分:2)

min_by方法完全符合您的要求:

buy_requests.min_by(&:created_at)

但是,除非你需要加载请求,否则让数据库进行排序通常会更有效率(假设这是一个活动的记录模型),通过做类似的事情

ByRequest.order('created_at asc').first

答案 2 :(得分:0)

您可以非常轻松地使用Ruby的sort_by方法。

objects.sort_by {|obj| obj.attribute}

所以你的例子就是:

buy_requests.sort_by { |req| req.created_at }

答案 3 :(得分:0)

为什么不在模型上使用#first mehod,如果您关心的是最早的created_at对象。我假设id是按顺序生成的。即1, 2, 3, 4

buy_requests.first

将为您提供最旧的BuyRequest实例。我假设对象BuyReuest是一个ActiveRecord对象