2

基本的に、私のクエリは、レコードの created_at がそれ自体の created_at より大きいと言っています。

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

User Load (1.0ms)  SELECT "users".* FROM "users" LIMIT 1
=> #<User id: 1, email: "my@email.com", 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が、#next引数を渡さない場合は同じオブジェクトを返します (デフォルトは: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
4

2 に答える 2

1

その場合は、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
于 2013-07-17T21:08:43.220 に答える
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
于 2013-07-24T00:14:16.517 に答える