14

Story日付までに注文しようとしているというモデルがありcreated_atます。Postgresql を使用する Heroku でアプリをホストしているため、コントローラーには次のものが含まれています。

@stories = Story.find( :all, :order => "DATE(created_at) DESC" , :limit => 11)

これにより、最初の 11 のストーリーが作成日順に並べられ、最新のストーリーが最初になると予想されます。

残念ながら、これは機能しません。ほとんどのストーリーは正しい順序で返されますが、最初の 2 つは反転しています。つまり、最新の記事がリストの 2 番目に表示されます。

これはなぜでしょうか?結果がまったく順序付けられていないか、間違った列 (おそらく id?) で順序付けされているのではないかと、ひそかに疑っています。これまでは、たまたまインデックス ページに表示されたときに期待どおりに順序付けられていました。期待どおりに注文するにはどうすればよいですか?

誰かが気にする場合のために説明すると、インデックス ビューは単純にストーリーを順番に表示しています。つまり (HAML):

- @stories.each do |story|
  = render :partial => "event", :locals => { :event => story }

編集

created_atが日時列であり、DATE(...)関数が時間部分を無視していると思われます。したがって、同じ日に作成された要素をランダムな順序で返します。最初の 2 つのストーリーは同じ日に作成されましたが、数時間離れているため、「反転」しているように見える理由が説明されます。この場合、日付と時刻の両方で並べ替える正しい構文は何でしょうか?

4

2 に答える 2

23

私はあなたが望むと信じています:

@stories = Story.find(:all, :order => "created_at DESC" , :limit => 11)

Rails 3+ の更新:

@stories = Story.order(created_at: :desc).limit(11)
于 2012-10-06T23:47:46.450 に答える
5

Rails 3 を使用している場合は、次のようなクールな新しいクエリ構文を使用することもお勧めします。

@stories = Story.order('created_at DESC').limit(11)

詳細については、アクティブ レコード クエリ インターフェイスを参照してください。

于 2012-10-07T04:16:36.220 に答える