【问题标题】: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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        相关资源
        最近更新 更多