在ActiveRecord中手动排序

时间:2012-05-30 21:30:04

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

我的数据库中的每个company都有很多projects,每个公司在注册时都会获得一个“常规任务”项目。该公司无法删除此特定项目,它被视为tasks的特殊存储库,尚未分配给该公司的其他项目之一。

在显示公司的项目时,我希望它们按字母顺序显示,但有一个例外,即“常规任务”出现在顶部。这需要对项目进行某种特殊处理以进行分类。我该怎么做:

@projects = @company.projects

并对其进行排序,以便得到如下列表:

'General tasks'
'ABC Project'
'BFA Project'
'ZNS Project'

2 个答案:

答案 0 :(得分:2)

您可以在SQL中执行此操作。这是一个适用于PostgreSQL的示例。无法弄清楚如何制作与数据库无关的版本,但您应该能够将其定制到您的RDBMS。

@projects = @company.projects.order("name != 'General tasks', name")

!=返回一个布尔值,并且在PostgreSQL false之前出现true所以我们不需要EQUAL来确保首先显示名为“General tasks”的记录。剩余的项目将按其名称排序。

另一种方法是在project表中添加一个列,将“常规任务”项目标记为特殊项目,如:

add_column :projects, :permanent, :boolean, :default => false

然后,您可以在不使用原始SQL的情况下进行排序:

@projects = @company.projects.order(:permanent, :name)

答案 1 :(得分:0)

当我回答here时,我刚刚发布了一个gem(order_as_specified),它允许你像这样进行本机SQL排序:

@company.projects.order_as_specified(name: ['General tasks', 'ABC Project', ...])

如果您提前知道(或者不想要计算)完整的选项列表,那么对您的用例可能不太好。好消息是它适用于Postgres,MySQL和SQLite。