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 的所有行带到顶部,其余的将保留为默认排序。

现在,就像其他人提到的那样,order没有任何机制来清理 SQL,因此您必须在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上order方法,和问号无关: 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 回答