是否可以在’order’方法条款中使用问号?

我正在使用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, ... 

如果您尝试根据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上使用protected class方法。

它可能看起来像这样:

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

你不能做ORDER BY user_id = 。 您只能通过ASC或DESC列进行订购。 有一些使用CASE关键字的高级案例。 请阅读mysql文档 。

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

你可以像这样封装where和order方法:

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

我认为这应该适合你。 我希望我正确地解释它。