我正在使用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, ...
答案 0 :(得分: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)
答案 1 :(得分:1)
你无法做ORDER BY user_id = <some_integer>
。您只能通过ASC或DESC列进行订购。有一些使用CASE关键字的高级案例。请阅读mysql documentation。
答案 2 :(得分: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
答案 3 :(得分:-1)
你可以像这样封装where和order方法:
Model.where("user_id = ?", params[:id]).order("field_name DESC")
我认为这应该适合你。我希望我能正确理解它。