Model.first不从表中检索第一条记录

时间:2013-09-16 12:42:19

标签: ruby-on-rails ruby-on-rails-3 activerecord

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 个答案:

答案 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 可以使用模型中的默认范围自动执行此操作,但我不确定。