可以在' order'中使用问号。方法从句?

时间:2012-12-10 14:03:40

标签: ruby-on-rails ruby-on-rails-3

我正在使用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 个答案:

答案 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)

答案 3 :(得分:-1)

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

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

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