Ruby on rails 在“顺序”方法子句中可以使用问号吗?

Ruby on rails 在“顺序”方法子句中可以使用问号吗?,ruby-on-rails,ruby-on-rails-3,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.

我使用的是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, ...

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

Model.where("user_id = ?", params[:id]).order("field_name DESC")
SELECT * FROM Categories ORDER BY CASE user_id WHEN 34 THEN 1 ELSE 2 END
order_sql = Category.send :sanitize_sql_array, ["CASE user_id WHEN ? THEN 1 ELSE 2 END", some_user_id]

@categories.order(order_sql)
我想这应该对你有用。我希望我理解正确。

您不能按用户\ u id=。只能按列ASC或DESC排序。有些高级案例使用CASE关键字。请仔细阅读

如果您查看源代码,与where子句源代码相比,它看起来并没有做任何带问号的事情

查看GitHub的order方法,与问号无关:

如果您试图根据用户id更改顺序,首先返回匹配的顺序,则应使用CASE语句

在原始SQL中,它将如下所示:

Model.where("user_id = ?", params[:id]).order("field_name DESC")
SELECT * FROM Categories ORDER BY CASE user_id WHEN 34 THEN 1 ELSE 2 END
order_sql = Category.send :sanitize_sql_array, ["CASE user_id WHEN ? THEN 1 ELSE 2 END", some_user_id]

@categories.order(order_sql)
这将使user_id为34的所有行都位于顶部,剩下的行将按默认顺序排列

现在,正如其他人提到的,order没有任何机制来清理SQL,因此您必须在ActiveRecord::Base上使用受保护的类方法

可能是这样的:

Model.where("user_id = ?", params[:id]).order("field_name DESC")
SELECT * FROM Categories ORDER BY CASE user_id WHEN 34 THEN 1 ELSE 2 END
order_sql = Category.send :sanitize_sql_array, ["CASE user_id WHEN ? THEN 1 ELSE 2 END", some_user_id]

@categories.order(order_sql)

您可以使用ruby字符串插值和Activerecord::Base。清理sql数组。我从未使用过这个方法。你能提供一个例子,说明在我的例子中如何在order子句中使用它吗?@categories.order ActiveRecord::Base.send:sanitize\u sql\u array,['user\u id=?',@user.id]这个sql到底在做什么?我从来没有见过有人想按属性排序,而属性等于某个东西。你想实现什么?不,不,我不需要选择user\u id=。我只需要ORDER BY user\u id=。ORDER BY user\u id=子句似乎按预期工作:它向前推取user\u id=的已检索记录。你为什么说我做不到?它实际上并不像你想象的那样工作。我只是在我自己的数据库上运行select*fromclientorderbyid=477,除了默认的mysql-config-orderby子句之外,它没有任何方式对它进行排序。MySQL没有通过这种方式使用order。如果阅读文档,您可以清楚地看到这一点。你到底想做什么?也许还有另一种方法。我阅读,我在玩,为了达到同样的目的…你需要一个案例陈述。这个答案在你链接的文章中提供。你有没有尝试过这里提供的答案?肖恩·希尔的答案,以及你链接到的文章中的答案,都会完全符合你的要求。案例用户id WHEN 34 THEN 1 ELSE 2 END statement(当34然后1 ELSE 2结束时)到底是什么?它怎么能将user_id为34的所有行置于顶部,而将其余的行保留为默认顺序?我从没听说过。。。在问题中解释的情况下,它是否真的应该使用?当您执行order语句时,sql使用字段的值进行排序。因此,如果您已按用户id从类别顺序中选择*,则将使用用户id的值来应用排序。在case语句中,您将截取user_id的值,并根据条件返回1或2。因为1在2之前,所以它被放在顶部。而且,你从来没有在你的问题中解释过这是用来做什么的。我只是猜测你的意图。你想做什么?好的,1在2之前,但我不明白它与将user_id=34的记录放在顶部有什么关系