Model.first不会从表中检索第一条记录。相反,它从表中检索任何随机记录。
eg:
Merchant.first
Query
SELECT "merchants".* FROM "merchants" LIMIT 1
=> <Merchant id: 6, merchant_name: "Bestylish", description: "", description_html: "" >
Instead the query should be
SELECT "merchants".* FROM "merchants" ORDER BY "merchants"."id" ASC LIMIT 1;
Why it doesnot retrive the first record
答案 0 :(得分:3)
Model.first将使用数据库的默认排序。 例如。在Postgresql中,默认排序不一定是id。
答案 1 :(得分:2)
这似乎是Postgres的默认行为,因为一些活动记录版本不首先为查询添加默认排序,而为最后添加一个。
https://github.com/rails/rails/issues/9885
PostgreSQL默认情况下不会应用排序,这对性能来说通常是一件好事。
所以在这个上下文中,“first”表示“返回的第一行”,而不是“按某些无意义的键值排序时的第一行”。
奇怪的是,“最后”看起来似乎是以id命令。
答案 2 :(得分:1)
如果没有指定其他订单条件,则在Rails 4中定义here,按主键排序。
在Rails 3.2.11中,它是这样的:
def find_first
if loaded?
@records.first
else
@first ||= limit(1).to_a[0]
end
end
没有order
方法,只会应用限制,然后将排序保留到数据库中。
答案 3 :(得分:0)
您需要自己申请订购。试着致电Merchant.order('id ASC').first
可以使用模型中的默认范围自动执行此操作,但我不确定。