【问题标题】:eq_any for boolean attributes - ransack用于布尔属性的 eq_any - ransack
【发布时间】:2013-07-05 13:49:29
【问题描述】:

我的模型book 中有一个布尔属性(已发布),我希望使用该值上的复选框过滤所有书籍。

class Book < ActiveRecord::Base
  attr_accessible :published
end

这意味着我想要eq_any 之类的东西,但需要truefalse。有没有办法使用 Ransack 做到这一点?

更新

我希望用户能够只选择已出版的书籍、未出版的书籍和任何书籍。所以一个复选框是不行的。

【问题讨论】:

    标签: ruby-on-rails-3 ransack


    【解决方案1】:

    我已经通过使用包含三个选项的选择列表解决了这个问题:“全部”、“是”和“否”

    = select :q, :published_true, [['Yes', 1], ['No', 0]], { include_blank: 'All', selected: params[:q] ? params[:q][:published_true] : '' }
    

    published_true 的查询字符串如下所示:

    q[published_true]=1 1 将返回已出版的书籍

    q[published_true]=00 将返回未出版的书籍

    q[published_true]= 空白 - 将返回已出版和未出版的书籍

    【讨论】:

      【解决方案2】:

      选择的答案效果很好,但是,至少在 2016 年,可以写出更好的东西。利用“eq”功能可以删除一些配置。最终结果是:

      <%= f.select :published_eq, [['Yes', true], ['No', false]], include_blank: 'All' %>
      

      【讨论】:

      • 请更正语法
      【解决方案3】:

      Renan,您可以使用 'true' 和 'false' 谓词来做到这一点(其他谓词在下面的文档链接中列出)。

      在您的表单中,您的复选框代码如下所示:

      <%= f.checkbox :published_true %>
      <%= f.checkbox :published_false %>
      

      因此,在您的表单中,选中第一个复选框 (published_true) 将返回所有已发布为 true 的书籍,选中第二个复选框 (published_false) 将返回所有已发布为 false(未发布)的书籍,并提交表单而不检查任何一个盒子都会归还所有书籍。

      更多信息可以在这里的文档中找到:https://github.com/ernie/ransack/wiki/Basic-Searching

      【讨论】:

      • 但是,如果我按照你说的做,当我提交未选中复选框的表单时,它只会检索出版不正确的书籍。我希望能够有两个复选框(一个用于已发布,另一个用于未发布),当我同时选中这两个复选框时,它实际上会执行 OR 而不是 AND。
      • @Renan 您有机会实际尝试代码吗?我在一个正在处理的项目上进行了一些类似的搜索,当我提交表单时没有选中复选框,ransack 会忽略它并返回所有结果。
      • 你是对的,但现在我想起来了(这是我的一个相当老的问题,所以我实际上已经解决了这个问题),我不想要一个复选框。我希望用户也能够只选择未出版的书籍,而您的解决方案不会这样做。我会更新问题以使其更清楚。
      • 我更新了我的答案。我有过被洗劫的头痛,希望这会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多