3

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

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

@projects = @company.projects

并对其进行排序,以便我们得到这样的列表:

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

2 回答 2

2

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

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

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

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

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

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

@projects = @company.projects.order(:permanent, :name)
于 2012-05-30T21:38:00.410 回答
0

正如我在这里回答的那样,我刚刚发布了一个 gem ( order_as_specified ),它允许您像这样进行本机 SQL 排序:

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

如果您不提前知道(或不想计算)完整的选项列表,这对您的用例可能不是很好。好处是它适用于 Postgres、MySQL 和 SQLite。

于 2015-03-13T18:43:58.170 回答