1

Ruby on Rails 3.2 を使用していますが、次のようにする方法があるかどうかを知りたいです。

@categories.order('user_id = ? DESC', params[:id])
@categories.order('user_id = ? DESC', @user.id)

# Note: It is almost the same as `@categories.where('user_id = ?', params[:id])`
# but for the `order` clause.

上記のステートメントは、次のエラーを生成します。

ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL 
syntax; check the manual that corresponds to your MySQL server version for the 
right syntax to use near '? DESC, ...
4

4 に答える 4

2

に基づいて順序を変更し、user_id最初に一致したものを返す場合は、CASEステートメントを使用する必要があります。

生の SQL では、次のようになります。

SELECT * FROM Categories ORDER BY CASE user_id WHEN 34 THEN 1 ELSE 2 END

これにより、user_id が 34 であるすべての行が一番上に移動し、残りはデフォルトの順序のままになります。

現在、他の人が述べているように、orderSQL をサニタイズするメカニズムがないため、保護されたクラス メソッドを on で使用する必要がありますActiveRecord::Base

次のようになります。

order_sql = Category.send :sanitize_sql_array, ["CASE user_id WHEN ? THEN 1 ELSE 2 END", some_user_id]

@categories.order(order_sql)
于 2012-12-10T15:12:15.750 に答える
1

はできませんORDER BY user_id = <some_integer>。列ASCまたはDESCでのみ注文できます。CASEキーワードを使用する高度なケースがいくつかあります。mysqlのドキュメントをお読みください。

于 2012-12-10T14:44:05.430 に答える
0

http://apidock.com/rails/ActiveRecord/QueryMethods/order

ソースを見ると、where 句のソース コードと比較して、疑問符が付いていると何もしていないように見えます。http://apidock.com/rails/ActiveRecord/QueryMethods/where

注文方法で GitHub も見て、クエスチョン マークとは関係ありません: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/query_methods.rb#L234

于 2012-12-10T15:05:13.783 に答える
-1

次のように where メソッドと order メソッドをカプセル化できます。

Model.where("user_id = ?", params[:id]).order("field_name DESC")

私はこれがあなたのためにそれをするべきだと思います。正しく理解していることを願っています。

于 2012-12-10T14:11:35.000 に答える