使用postgreSQL奇怪的行为增加计数器和rails“first”

时间:2011-06-29 19:04:09

标签: ruby-on-rails postgresql

当我使用increment_counter递增一些整数列并传递一些记录ID然后尝试使用Model.first获取第一条记录时,这将返回记录ID加1。

这样的事情:

Model.increment_counter :field, id
Model.first

不返回

Model.find(1)

Model.find(id+1)

这是postgreSQL的一些特殊问题吗?

2 个答案:

答案 0 :(得分:6)

Model.first将使用您的数据库的默认排序(必然是ID)。

请改为尝试:

Model.order("id").first

答案 1 :(得分:0)

您可以对ActiveRecord进行一些猴子修补,

#lib/postgresql_extras.rb

module ActiveRecord
  class Base
    def self.first_by_id
      order(:id).first
    end
    def self.all_by_id
      order(:id)
    end
  end
end

并在某些初始化程序中需要这个

#config/initializer/extensions.rb

require "postgresql_extras"

不要先调用 all ,因为它会在其他查询中生成错误,例如User.order(:email).limit(1)it将与User.order(:email).first不同,在这种情况下,因为它将按ID重新排序项目, 我没有在posgresql中找到其他有问题的方法,我尝试通过更改表格pkey来修复它,但不是运气那里