【问题标题】:Manual sorting in ActiveRecord在 ActiveRecord 中手动排序
【发布时间】:2015-03-14 02:43:58
【问题描述】:
我数据库中的每个company 都有很多projects,每个公司在注册时都会获得一个“常规任务”项目。此特定项目无法被其公司删除,它被视为尚未分配给公司其他项目之一的 tasks 的特殊存储库。
在显示公司的项目时,我希望它们按字母顺序显示,但唯一的例外是“常规任务”显示在顶部。这需要出于排序目的对项目进行某种特殊处理。我该如何服用:
@projects = @company.projects
并对其进行排序,得到如下列表:
'General tasks'
'ABC Project'
'BFA Project'
'ZNS Project'
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
sorting
activerecord
【解决方案1】:
您可以在 SQL 中执行此操作。这是一个适用于 PostgreSQL 的示例。无法弄清楚如何制作与数据库无关的版本,但您应该能够根据您的 RDBMS 对其进行定制。
@projects = @company.projects.order("name != 'General tasks', name")
!= 返回一个布尔值,在 PostgreSQL 中,false 位于 true 之前,因此我们不需要 EQUAL 以确保首先显示名称为“常规任务”的记录。其余项目将按名称排序。
另一种方法是在您的项目表中添加一列,将“常规任务”项目标记为特殊项目,例如:
add_column :projects, :permanent, :boolean, :default => false
然后,您可以不使用原始 SQL 进行排序:
@projects = @company.projects.order(:permanent, :name)
【解决方案2】:
当我回答 here 时,我刚刚发布了一个 gem (order_as_specified),它允许您像这样进行本机 SQL 排序:
@company.projects.order_as_specified(name: ['General tasks', 'ABC Project', ...])
如果您不提前知道(或不想计算)选项的完整列表,这可能对您的用例不利。好处是它适用于 Postgres、MySQL 和 SQLite。