4

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

有人对此有一些想法吗?

4

2 回答 2

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代码。

于 2015-04-13T13:42:30.183 回答
0

如果有人遇到像我这样的问题,那么 ransack 中有一个有趣的 PR,它允许在search方法中使用作用域作为键:https ://github.com/activerecord-hackery/ransack/pull/288

于 2013-12-05T09:21:18.923 回答