添加使用具有多个条件的范围的自定义ransacker

时间:2013-11-11 12:18:40

标签: ruby-on-rails ransack

我正在使用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

有人对此有一些想法吗?

2 个答案:

答案 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

在您的观点中(根据https://github.com/activerecord-hackery/ransack#ransacks-search_form_for-helper-replaces-form_for-for-creating-the-view-search-form):

= 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