是否可以在’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")
我认为这应该适合你。 我希望我正确地解释它。