红宝石-在Rails 3中找到最新记录

我想知道是否有办法在Rails 3的表中找到最新记录?

谢谢

艾略特

Elliot asked 2019-11-13T07:37:31Z
5个解决方案
120 votes

给定Post模型,您可以执行@post = Post.last

(我之所以不只做@post = Post.last的原因是,它总是默认按主键排序(通常是id)。在大多数情况下,这是可以的,但我敢肯定,在这种情况下可能会引起问题(例如 设置记录上的自定义ID,影响主键排序/自动编号的数据库更改等)。按created_at时间戳进行排序可确保您确实获得了最新记录)。

Dylan Markow answered 2019-11-13T07:38:06Z
21 votes

尽管dmarkow的答案在技术上是正确的,但是您需要在created_at上建立索引,否则随着数据库的增长,查询的风险会越来越慢。

如果您知道“ id”列是一个自动递增的主键(很可能是),那么就使用它,因为按定义它是一个索引。

同样,除非AREL已优化为在find(:last)中仅选择一个记录,否则您将冒着使其选择ALL记录的风险,然后使用“ last()”方法仅返回最后一个记录。 更有效率的是将结果限制为一个:

MyModel.last(:order => "id asc", :limit => 1)

要么

MyModel.first(:order => "id desc", :limit => 1)
jemminger answered 2019-11-13T07:38:45Z
3 votes

您可能会在流量足够高的表上使用created_at遇到歧义问题。

例如。 尝试:

INSERT INTO table (created_at) VALUES ( NOW() );
INSERT INTO table (created_at) VALUES ( NOW() );

..具有相同的created_at的潜力,其分辨率只有1秒。 某种排序不会按特定顺序返回它们。

您最好存储微时间值并对其进行排序。

RUN-CMD answered 2019-11-13T07:39:33Z
2 votes

是的,您可以使用.last方法

因此,如果您的模型称为Post,则:

>> Post.last
=> #<Post ...>
DanneManne answered 2019-11-13T07:40:05Z
1 votes

尝试使用名为ModelName的模型:

record = ModelName.last
Sam Ritchie answered 2019-11-13T07:40:30Z
translate from https://stackoverflow.com:/questions/4870531/find-the-newest-record-in-rails-3