activerecord在范围内设置

时间:2015-01-27 05:41:24

标签: ruby-on-rails activerecord named-scopes

我有一个表格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导致"未定义的方法`bus_setting'对于类: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) }

2 个答案:

答案 0 :(得分:1)

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

在你的情况下,这个90.days.ago有点静态。如果你想让它变得动态,那么你应该使用这个范围的参数。

在下面的示例中,范围:due, - &gt;(n),这里n是在评估where条件时将使用的参数。

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

现在,在使用参数值调用此特定范围时:3将获取具有mass_verfication_date&lt;的所有业务设置。 3.days.ago

Call this : 
  BusinessSetting.due(3)

答案 1 :(得分:0)

@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)

再次谢谢你。