Rails 3查询接口 - 高级订购

时间:2011-09-09 16:19:31

标签: sql ruby-on-rails activerecord

我在将所有Rails ActiveRecord发现迁移到新的查询接口时遇到了问题。大多数都很简单,但这个更复杂。

我们遇到了一个问题,我们想要列出从我们的数据库中说出一定数量的项目但是按特定顺序返回结果,而不仅仅是降序,升序。对此的旧解决方案是这样的。

ids = [2,19,1,11,22]
Project.find(:all, :conditions => {:id => ids}, :order => "FIELD(id,#{ids.join(',')})")

顺序是应该的,尝试使用它引发的新查询接口。

Project.where(:id => ids).order("FIELD(id,#{ids.join(',')})")

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,1018 DESC,1017) DESC LIMIT 1' at line 1: SELECT  `projects`.* FROM `projects` WHERE (`projects`.`id` IN (1018, 1017)) ORDER BY FIELD(id DESC,1018 DESC,1017) DESC LIMIT 1

所以'order'接受一个字符串并假定它总是一个字段名或一个字段名列表。

有人知道这方面的方法吗?非常感谢。

RobL

1 个答案:

答案 0 :(得分:0)

确定你有一个纯粹由整数组成的数组(SQL插入;),然后以下内容应该可以工作。

join_ids = ids.join(',')
Project.find_by_sql ["SELECT * FROM projects WHERE id IN [?] ORDER BY FIELD(id,?);",join_ids,join_ids]

你明白了。不过很不错。