我的数据库中的每个company
都有很多projects
,每个公司在注册时都会获得一个“常规任务”项目。该公司无法删除此特定项目,它被视为tasks
的特殊存储库,尚未分配给该公司的其他项目之一。
在显示公司的项目时,我希望它们按字母顺序显示,但有一个例外,即“常规任务”出现在顶部。这需要对项目进行某种特殊处理以进行分类。我该怎么做:
@projects = @company.projects
并对其进行排序,以便得到如下列表:
'General tasks'
'ABC Project'
'BFA Project'
'ZNS Project'
答案 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。