范围内的活动记录设置

activerecord setting in scope

我有一个 table business_settings,它使用 keyvalue 列来存储业务设置。

我写了一个帮助程序来收集这些值:

def bus_setting(bus_key)
    bus_setting = BusinessSetting.where(key: bus_key).first
    return bus_setting.nil? ? bus_key : bus_setting.value   
end

在这种情况下,返回的值是一个值为 90 的整数。

这是我试图写的范围,但是助手 bus_setting 导致 "undefined method `bus_setting' for Class:0x00..."

scope :due, -> { where("mass_verification_date < ?", bus_setting('MASS_VERIFICATION_INTERVAL')to_i.days.ago) }

我是按写作​​方式处理还是犯了一个愚蠢的错误?谢谢

编辑:此范围实现了我所追求的结果,但我不想对值进行硬编码。 scope :due, -> { where("mass_verification_date < ?", 90.days.ago) }

static scope:
  scope :due, -> { where("mass_verification_date < ?", 90.days.ago) }

在你的例子中,这个 90.days.ago 是静态的。如果你想让它成为动态的,那么你应该为此范围使用参数。

在下面的示例中,范围 :due, ->(n),这里的 n 是将在计算 where 条件时使用的参数。

Make it dynamic: 
  scope  :due, ->(n) { where("mass_verification_date < ?", n.days.ago) }

现在,在使用参数值调用此特定范围时:3 将获取具有 mass_verfication_date < 3.days.ago

的所有业务设置
Call this : 
  BusinessSetting.due(3)

@Ajay,感谢您的输入 - 我实际上已经实现了一个混合解决方案:

mass_verification.rb

scope :due, ->(n) { where("mass_verification_date < ?", n.to_i.days.ago) }

def mass_interval
    mass_interval = bus_setting("MASS_VERIFICATION_INTERVAL")
end

并让 bus_setting 助手启动:

include BusinessSettingsHelper

调用看起来像这样: MassVerification.due(mass_interval)

再次感谢您。