2011-07-01 7 views
0

レコードのソートに問題がある(または私の誤解があります)。私のアプリケーションでは、データセットはスクリプトによってロードされ、データセットにはいくつかのレコードが含まれ、それらのすべてに同じcreated_atフィールドがあります。その後、レコードは手動で編集/更新されるため、updated_atは異なります。私は上に最新の更新されていないレコードを見たいと思う、基本的には、created_atで逆のoder(古いデータは下に行く)、次にupdated_atでレコードを2つのフィールドでソートする必要がある更新されていない)。モデルは次のようになります。二組のデータをロードした後ruby​​ on railの2つのフィールドでレコードをソート

class Part < ActiveRecord::Base 
    default_scope :order => "created_at DESC, updated_at" 
end 

、私はコンソール内のレコードを取得しようと、出力は次のようになります。どうやら

$ bundle exec rails console 
Loading development environment (Rails 3.0.5) 
>> Part.all.each {|p| puts p.created_at} 
2011-07-01 19:52:00 UTC 
2011-07-01 19:52:00 UTC 
2011-07-01 19:26:44 UTC 
2011-07-01 19:26:44 UTC 
>> Part.all.each {|p| puts p.updated_at} 
2011-07-01 19:52:09 UTC 
2011-07-01 19:52:00 UTC 
2011-07-01 19:27:15 UTC 
2011-07-01 19:33:01 UTC 

、ソートが機能しません。予想されるように、予想される(望ましい)が出力される。

>> Part.all.each {|p| puts p.updated_at} 
2011-07-01 19:52:00 UTC 
2011-07-01 19:52:09 UTC 
2011-07-01 19:27:15 UTC 
2011-07-01 19:33:01 UTC 

Iは、モデルからdefault_scopeを除去し、そしてfollowiを実行しようとしましたNGはコンソールで動作しますが、それは助けていませんでした:

Part.group("created_at").order("updated_at").each {|p| puts p.updated_at} 
Part.order("created_at DESC, updated_at").each {|p| puts p.updated_at} 

誰もが希望する順序を達成するためにどのように説明できますか?

UPD:すなわちcreated_at2011-07-01 19:52:00 UTCではなく、2011-07-01 19:52:00.12345 UTC、二発注オプションはタイムスタンプがわずか数秒よりも高い精度で保存されているという理由だけで考慮されていないこと、らしいです。その結果、すべてのレコードに一意のcreated_atタイムスタンプがあるため、このフィールドでグループ化することはできません。私は正しい?

答えて

1

解決策が見つかりました:2つのフィールドでソートする代わりにupdated_atRuby on Rails: updated_at - set as 0 on creationに示唆されているようにゼロに設定し、updated_atフィールドのみでソートしました。更新されていないすべてのレコードが一番上に出力されます。

0

updated_atも降順でソートする必要がありますか? created_at DESC, updated_at DESCでご注文ください。

+0

残念ながら、動作しません。私はモデル 'default_scope:order =>" created_at DESC、updated_at DESC "'とコンソール 'Part.order(" created_at DESC、updated_at DESC ")で設定しようとしました。 puts p.updated_at} '、どちらも希望の順序を与えません... – zeliboba

関連する問題