我有一个带有 :birthday 属性的模型,我想按表单中指定的月份过滤掉那些日期(ActiveAdmin 的 DSL :select)。
这是一个仅提取生日月份的简单范围示例。也许可以帮助:
scope :birthday_month, where('extract(month from birthday) = ?', Date.today.month)
我有一个带有 :birthday 属性的模型,我想按表单中指定的月份过滤掉那些日期(ActiveAdmin 的 DSL :select)。
这是一个仅提取生日月份的简单范围示例。也许可以帮助:
scope :birthday_month, where('extract(month from birthday) = ?', Date.today.month)
这是一个解决方案:
在我的 Active Admin 资源 (app/admin/employees.rb) 上,我输入:
filter :month, :as => :select, :collection => (1..12)
在我的模型(app/models/employee.rb)上:
scope :month_eq, lambda{ |month| where("strftime('%m', birthday) + 0 = ?", month.to_i) }
search_methods :month_eq
这种方法定义了“_eq”范围方法(MetaSearch)并通过search_methods :month_eq
(MetaSearch)将其变为可用。
注意:
如果您不使用 sqlite,也许您会希望使用它where('extract(month from birthday) = ?', month.to_i)
。
Active Admin 最新版本的解决方案:
#app/admin/employees.rb
filter :month, :as => :select, :collection => (1..12)
#app/models/employee.rb
scope :month_eq, ->(month) { where('MONTH(birthday) = ?', month.to_i) } # for MySQL
def self.ransackable_scopes(_auth_object = nil)
[:month_eq]
end