我正在使用Ransack gem,我的模型有这样的范围:
scope :by_attr, ->(attr) {
case attr
when val1
query1
when val2
query2
else
all
end
}
我无法弄清楚,如何编写使用此范围的ransacker。例如,我想要这种行为:
MyModel.search(by_attr: val1) # should return MyModel.query1
MyModel.search(by_attr: val2) # should return MyModel.query2
有人对此有一些想法吗?
答案 0 :(得分:5)
来自https://github.com/activerecord-hackery/ransack/pull/288:
的摘录在你的模特中:
scope :by_name, ->(name) {
where name: name
}
def self.ransackable_scopes(auth_object = nil)
[:by_name]
end
= search_form_for @q do |f|
= f.search_field :by_name, value, [['Value 1', val1], ['Value 2', val2]]
要避免在创建表单时使用显式数组,请使用不同的帮助程序,例如options_from_collection_for_select
。
您也可以在代码中编写MyModel.ransack(by_name: value).results
。
答案 1 :(得分:0)
如果有人像我一样有问题,那么在搜索中有一个有趣的公关,允许在search
方法中使用范围作为键:https://github.com/activerecord-hackery/ransack/pull/288