Ransack eq_any用于布尔值

时间:2014-04-12 08:18:58

标签: ruby-on-rails ruby-on-rails-3 ransack

我的模型有一个名为ignored的布尔字段。到目前为止我所做的不是通过default_scope where(:ignored => false)将此字段设置为true的显示记录。

现在,在我的Ransack搜索表单中,我希望有一个名为Include ignored的复选框,这样表格也会显示被忽略的记录以及不属于的记录。

我已经将复选框添加到我的搜索表单f.check_box(:ignored_eq),但在检查时,列表将仅显示被忽略的记录。选中此框时,如何在所有状态下显示记录?

控制器:

def index
  @q = Venue.search(params[:q])
  @venues = @q.result.page(params[:page]).per_page(15)
end

搜索表单(HAML):

= search_form_for @q, url: [:admin, :venues]  do |f|
  = f.text_field :name_cont
  = f.text_field :locality_name_cont
  = f.text_field :categories_name_cont
  = f.check_box :ignored_eq
  = content_tag :button, type: :submit, class: 'btn' do
    = content_tag(:i, "", class: "icon-search")
    = t("helpers.links.search")

所需的功能是:当我进入页面时,我想只列出那些列出了ignore = false并且未选中该框的页面。当我选中该框并提交我想要忽略的表格以及显示的未忽略的表格。这对Ransack来说可能吗?

1 个答案:

答案 0 :(得分:1)

您可以使用rewhere AR方法。

并为ignored标志添加类似内容:

def index
  @q = Venue.search(params[:q])
  @q = @q.rewhere("ignored = 0 OR ignored = 1") if params[:ignored_eq] == 1
  @venues = @q.result.page(params[:page]).per_page(15)
end

您还可以使用unscoped方法清除default_scope

def index
  if params[:ignored_eq] == 1
    @q = Venue.unscoped.search(params[:q])
  else
    @q = Venue.search(params[:q])
  end
  @venues = @q.result.page(params[:page]).per_page(15)
end

更漂亮(IMO)