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

Den*_*rov 3 ruby-on-rails ransack

我正在使用Ransack gem,我有一个模型,其范围如下:

scope :by_attr, ->(attr) {
  case attr
  when val1
    query1
  when val2
    query2
  else
    all
  end
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚,我怎么能写一个使用这个范围的ransacker.例如,我想要这种行为:

MyModel.search(by_attr: val1) # should return MyModel.query1
MyModel.search(by_attr: val2) # should return MyModel.query2
Run Code Online (Sandbox Code Playgroud)

有人对此有一些想法吗?

Nic*_*Roz 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
Run Code Online (Sandbox Code Playgroud)

在您的视图中(根据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]]
Run Code Online (Sandbox Code Playgroud)

为避免在创建表单时使用显式数组,请使用不同的帮助程序,例如options_from_collection_for_select.

您也可以MyModel.ransack(by_name: value).results在代码中编写代码.

  • 你让我今天一整天都感觉很好.我找到了2年,终于找到了它!要与ActiveAdmin一起使用,请执行以下操作:scope:by_name_eq, - >(name){where(name:name)} def self.ransackable_scopes(auth_object = nil)[:by_name_eq] end#在AA过滤器中:by_name_eq并使用范围作为Ransack过滤器! (2认同)