在rails模型中拥有默认订单的最佳方法是什么?

时间:2019-07-17 09:53:25

标签: ruby-on-rails postgresql

我有一个项目,要求在列表中以id顺序在不同页面中显示集合或关联。该数据库是PostgreSQL。

通常,默认情况下,数据将按照ID的顺序存储。但是,我的数据库不是那样,如果您不应用订单,则总是以不同的顺序返回,即[1432、1430、1401、1400]。

当前,我必须手动为每个关联添加订单范围。但这看起来很挑剔。即使在一个模型中,我也必须多次添加。

class A
  has_many :xxx, -> { order(:id)}
  has_many :yyy, -> { order(:id)}
  has_many :zzz, -> { order(:id)}
end

class B
  has_many :aaa, -> { order(:id)}
  has_many :bbb, -> { order(:id)}
  has_many :xxx, -> { order(:id)}
end

...

因此,我正在寻找更好的解决方案。我能想到的一种解决方案是将default_scope添加到ActiveRecord::Base类。但是我听说default_scope是反党派的吗?

class ApplicationRecord < ActiveRecord::Base
   default_scope { order(:id) }
end

随时给我任何建议。谢谢。

1 个答案:

答案 0 :(得分:0)

对于您的情况,default_scope是一个不错的选择,但是如果您不想使用default_scope,则可以使用模型关注点并在关注点中定义范围,并将其包含在模型中。

https://api.rubyonrails.org/classes/ActiveSupport/Concern.html

module DefaultScope

  extend ActiveSupport::Concern

  included do
    scope :asc_order, -> { order(id: :asc) }
  end
end
class ModelName < ApplicationRecord
  include DefaultScope
end