4

こんにちは、Rails 3.2 と順序付けに問題があります。

コレクションをフィールドで並べ替えたいとき、呼び出し.last ActiveRecordがおかしいとき...

   >> User.order("FIELD(id, '1')")
   User Load (0.4ms)  SELECT `users`.* FROM `users` ORDER BY FIELD(id, '1')
   => []
   >> User.order("FIELD(id, '1')").first
   User Load (0.4ms)  SELECT `users`.* FROM `users` ORDER BY FIELD(id, '1') LIMIT 1
   => nil
   >> User.order("FIELD(id, '1')").last
   User Load (0.3ms)  SELECT `users`.* FROM `users` ORDER BY FIELD(id DESC, '1') DESC LIMIT 1
   Mysql2::Error: You have an error in your SQL syntax;

ご覧のとおり、リレーション add で最後に 2 回呼び出していますが、括弧内ではなくDESC、全体の後にのみ配置する必要があります。ORDER BY FIELD

誰もそれを行う方法を知っていますか?

ありがとう!

4

2 に答える 2

2

これは、FIELD関数が ActiveRecordorderメソッドでサポートされていないためです。order メソッドを使用すると、カンマがフィールド セパレータとして解析されDESC、 を呼び出すときに各セグメントに追加されますlast

別の方法として、FIELD() の使用を避けるか、使用を避けてlastフォワード スコープとリバース スコープを提供するだけです。

scope :forward_order, order("FIELD(id, '1') ASC")
scope :reverse_order, order("FIELD(id, '1') DESC")

User.reverse_order.first次に、代わりに使用できますUser.order(...).last

于 2012-08-23T17:34:56.687 に答える
2

これは古いものですが、今日この問題に遭遇し、追加のスコープを使用する必要のない回避策を見つけました。

への呼び出しをラップする SQL 関数を作成しますFIELD。これにより、への呼び出しにコンマがなくなりますorder。これは PostgreSQL ですが、翻訳は簡単です。

CREATE FUNCTION field1(value text) RETURNS text AS $$
BEGIN
  RETURN FIELD(value, 1);
END;
$$ LANGUAGE plpgsql IMMUTABLE

lastActiveRecord での呼び出しが機能するようになりました:

User.order('field1(id)').last
于 2016-06-04T18:17:30.670 に答える