2013-07-17 29 views
1

基本上,我的查詢是說,一個記錄的created_at大於它自己的created_at。如何比較created_at可靠的Rails Activerecords

irb(main):025:0> u = User.first 

User Load (1.0ms) SELECT "users".* FROM "users" LIMIT 1 
=> #<User id: 1, email: "[email protected]", encrypted_password: "stuff...", created_at: 
"2012-02-01 18:56:45", updated_at: "2012-03-17 21:10:13"> 

irb(main):026:0> User.where("created_at > ?", u.created_at).include? u 

User Load (1.0ms) SELECT "users".* FROM "users" WHERE (created_at > '2012-02- 
01 18:56:45.740392') 
=> true 

顯示的查詢清楚地表明,這是一個日期時間格式問題...當它建立查詢它的四捨五入第二的分數。 我可以修改查詢以使其按照created_at的順序/一致性進行排序嗎?

我討論了其他一些討論ActiveRecord精度和建議strftime等問題,但我無法使它可靠地工作。我在開發中使用SQLite(我的控制檯報價如上)和Postgres在生產中。

注:這裏的更廣泛的目標是增加#next#previous methods大多數/我所有的資源,這樣我就可以通過他們更容易在我的管理菜單進行迭代。如果還有其他方法可以實現可靠的默認訂單,我可以接受。

這兩種方法都可以正常的編碼,當我通過非時間戳參數,像:name以下,但如果我沒有傳遞參數(默認爲:created_at

def previous(column = :created_at) 
self.class.first(:conditions => ["#{column} < ?", self.send(column)], :order => "#{column} desc") 
end 

def next(column = :created_at) 
self.class.first(:conditions => ["#{column} > ?", self.send(column)], :order => "#{column} asc") 
end 
+0

它還剛剛發生,我認爲這實現不會做的非常好,如果你在這裏多條記錄有相同的值的屬性進行排序。如編碼一樣,它會隨意選擇一個具有該值的記錄,然後在迭代它們時跳過其他記錄。 – LikeMaBell

回答

1

對於這種情況你應該只#next返回相同的對象使用該ID,不要擔心日期(無論如何,它的工作方式會差不多)。這是自然排序,索引等。

def previous(column = :id) 
    self.class.first(:conditions => ["#{column} < ?", self.send(column)], :order => "#{column} desc") 
end 

def next(column = :id) 
    self.class.first(:conditions => ["#{column} > ?", self.send(column)], :order => "#{column} asc") 
end 
+0

是的,這顯然是我應該首先擺脫的方式。謝謝。 – LikeMaBell

0

這將解決我的意見,關於跳過記錄等值的字段被排序。

def previous(column = :id) 
self.class.first(:conditions => ["#{column} = ? AND id < ?", self.send(column), self.id], :order => 'id desc') || 
    self.class.first(:conditions => ["#{column} < ?", self.send(column)], :order => "#{column} desc")  
end 

def next(column = :id) 
self.class.first(:conditions => ["#{column} = ? AND id > ?", self.send(column), self.id], :order => 'id asc') || 
    self.class.first(:conditions => ["#{column} > ?", self.send(column)], :order => "#{column} asc") 
end