【问题标题】:Managing the default order of a table in Rails 3在 Rails 3 中管理表的默认顺序
【发布时间】:2014-01-17 23:12:42
【问题描述】:

我有一个模型,里面有超过 40,000 个整体。我希望能够使该表按其属性之一永久排序。棘手的部分是某些元素对于我要排序的属性具有 nil 值。

一些闲逛让我找到了default_scope,但它似乎已被弃用,每个人都警告不要这样做。似乎放置 default_scope order('director_id DESC') 或类似的东西可以解决问题,但这并没有考虑到 nil 值。有什么更好的选择?

谢谢!

编辑 我还在使用 Tire 和 ElasticSearch 来管理搜索。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 scope elasticsearch


    【解决方案1】:

    是的,最好对模型范围进行明确说明。你可以这样做:

    class MyModel < ActiveRecord::Base
      def self.default_order
        order('director_id DESC NULLS LAST')
      end
    end
    

    您的数据库将有一个语法作为ORDER BY 的一部分,用于放置 NULL 值。如果您根本不想在输出中出现 NULL 值,那么您可以添加一个 where 调用,并且应该重命名该方法。

    【讨论】:

    • 啊,抱歉,显然 MySQL 对 ORDER BY 子句中的 NULL 值没有合理的行为。如果您使用的是 MySQL,您可能需要将 COALESCE 中的列 SELECT 设置为任意数字。
    • 我在 prod 中使用 Postgres,在 dev 中使用 SQLite
    • Postgres 支持答案中的语法。 :)
    • 所以我只是将这 3 行添加到我的模型中,当我从控制器运行查询时,它会自动排序,不需要做其他工作?
    • 不,您必须致电MyModel.default_order.alldefault_scope 由于意外行为和不断变化的需求,随着时间的推移造成的伤害比输入一些额外的字符要大得多。 :) 注意def self.by_director 可能是一个更好的方法名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多