2

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
4

4 回答 4

3

Model.first 将使用数据库的默认排序。例如。在 Postgresql 中,默认排序不一定是 id。

于 2013-09-16T12:49:08.110 回答
2

这似乎是 Postgres 的默认行为,因为某些活动记录版本不会为第一个查询添加默认排序,而为最后一个添加一个。

https://github.com/rails/rails/issues/9885

PostgreSQL 默认不应用排序,这通常对性能是件好事。

所以在这种情况下,“第一”的意思是“返回的第一行”,而不是“按一些无意义的键值排序的第一行”。

奇怪的是,“最后一个”似乎是按 id 排序的。

于 2013-09-16T12:49:01.620 回答
1

在 Rails 4 中这里定义,如果没有指定其他排序条件,则按主键排序。

在 Rails 3.2.11 中,它是这样的:

def find_first
  if loaded?
    @records.first
  else
    @first ||= limit(1).to_a[0]
  end
end

如果没有该order方法,它将仅应用限制,然后将排序留给您的数据库。

于 2013-09-16T13:06:10.093 回答
0

您需要自己申请订单。尝试调用Merchant.order('id ASC').first 它可能可以使用模型中的默认范围自动执行此操作,但我不确定。

于 2013-09-16T13:01:08.563 回答