我正在尝试创建一个自定义ActiveAdmin过滤器,它将date_range作为参数。我发现的每个解决方案都是针对过于简单的模型方法。
有没有办法将两个参数传递给模型ransacker方法,和/或至少控制这些参数传递的顺序以及知道哪个参数是通过呢? (end_date与start_date - start_date首先被传递,而我可能能够解决这个问题,因为end_date是先发送的)。任何替代解决方案都不会破坏应用程序中的所有其他过滤器(即,覆盖activeadmin过滤器以使用范围 - 这是应用程序中数百个过滤器中的一个过滤器)也欢迎。
谢谢!
管理员/ model.rb
filter :model_method_in, as: :date_range
模型/ model.rb
ransacker :model_method, :formatter => proc { |start_date, end_date|
Model.complicated_method(start_date, end_date)
} do |parent|
parent.table[:id]
end
...
def method_for_base_queries(end_date)
Model.long_complicated_sql_call_using_end_date
end
def complicated_method(start_date, end_date)
model_instances = method_for_base_queries(end_date)
model_instances.logic_too_complex_for_sql_using_start_date
end
类似的问题,但过滤器/模型逻辑非常简单,可以替代不需要传递两个参数的替代解决方案:Custom ActiveAdmin filter for Date Range
答案 0 :(得分:0)
这可能会有所帮助。给定您的索引过滤器
filter :model_method, as: :date_range
您可以在模型中编写以下内容:
scope :model_method_gteq_datetime, -> (start_date) {
self.where('users.your_date_column >= ?', start_date)
}
scope :model_method_lteq_datetime, -> (end_date) {
# added one day since apparently the '=' is not being counted in the query,
# otherwise it will return 0 results for a query on the same day (as "greater than")
self.where('users.your_date_column <= ?', (Time.parse(end_date) + 1.day).to_date.to_s)
}
def self.ransackable_scopes(auth_object = nil)
[model_method_gteq_datetime, :model_method_lteq_datetime]
end
..._gteq_datetime
和..._lteq_datetime
是Activeadmin解释自定义date_range
索引过滤器中的两个日期的方式(另请参见添加过滤器后生成的相应URL)。
由于我不了解您的查询的复杂性,因此我编写了一个适合我的情况的示例查询(假设users
是与当前查询相关的模型)。
我正在使用: