4

レール 2.3.4、sqlite3

私はこれを試しています

Production.find(:all, :conditions => ["time > ?", start_time.utc], :order => "time DESC", :limit => 100)

条件は完全に機能しますが、:order => time DESCに問題があります。

たまたま、PostgreSQL が動作する Heroku (heroku コンソールでテスト中) で動作することを発見しました。ただし、ローカルで sqlite3 を使用すると、時間の設定に関係なく、新しいエントリは古いエントリの後に並べ替えられます。このように (出力は手動で削除されました): 2 番目のエントリは新しいものです:

プロダクション ID: 2053939460、時間: "2010-04-24 23:00:04"、created_at: "2010-04-24 23:00:05"

プロダクション ID: 2053939532、時間: "2010-04-25 10:00:00"、created_at: "2010-04-27 05:58:30"

プロダクション ID: 2053939461、時間: "2010-04-25 00:00:04"、created_at: "2010-04-25 00:00:04"

プロダクション ID: 2053939463、時間: "2010-04-25 01:00:04"、created_at: "2010-04-25 01:00:04"

timeではなく、主キーidでソートされるようです。クエリはherokuで正常に機能し、正しい順序のリストを返すことに注意してください! 私はsqliteが好きです、それはとてもKISSです、あなたが私を助けてくれることを願っています...

助言がありますか?


更新/解決済み: timeは予約済みの sqlite3 キーワードです ( dateなどもそうです)。これが:order => 'time DESC'、PostgreSQL (予約されていないキーワード) では機能するのに、sqlite3 では機能しない理由です。解決策は、ソートする予定がある場合に列名として sqlite3 キーワードを使用しないようにすることです。名前を変更すると問題が解決します。

私は完全に動作する標準的なレール パターンupdated_atcreated_atでテストしました。

私はまだ開発中の sqlite3 を好みます。操作がとてもシンプルでスムーズで、データベースをコピーしてパートナーに送信できます。@newtover に感謝!

4

1 に答える 1

5

通常、引用符で囲まずに予約語を使用することはお勧めできません。timeはSQLiteの組み込み関数です。代わりに次の関数を使用してみて、最初からあいまいさを取り除いてください。

Production.find(:all,
                :conditions => ["`time` > ?", start_time.utc],
                :order => "`time` DESC",
                :limit => 100)

UPD:問題はSOに現れたようです:

Rails Active Record find(:all、:order =>)の問題

于 2010-04-27T09:34:02.057 に答える