【问题标题】:Searching multiple fields with Ransack使用 Ransack 搜索多个字段
【发布时间】:2012-10-29 19:57:04
【问题描述】:

我正在使用 Ransack 允许对我的用户进行高级搜索。目前,用户有first_namemiddle_namelast_name 列。这是我的代码:

.field
  = f.attribute_fields do |a|
    = a.attribute_select
    ...

我怎样才能有一个名为“名称”的自定义项,让用户可以搜索上述所有三个列?

注意 我仍然希望将其余属性也保留为选项,例如电子邮件、电话号码等。在确定答案时请记住这一点。

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    我建议为此搜索提供一个专用列。虽然这可能会产生冗余数据,但搜索比在现有列上执行一些 SQL 魔术方式更容易。

    您可以轻松地自动设置此字段:

    before_save :set_full_name
    
    def set_full_name
      self.full_name = [first_name, middle_name, last_name].reject(&:blank?).join(" ")
    end
    

    那么你就可以使用正常的ransack方法来搜索这个字段了。

    【讨论】:

    • 是的,这是个好主意。谢谢@Thilo。
    【解决方案2】:

    使用它来搜索多个字段:

    = f.text_field(: first_name_or_middle_name_or_last_name_cont)
    

    这将生成如下查询:

    where first_name like '%q%' or middle_name like '%q%' or last_name like'%q%' 
    

    当你填写一个 q 作为搜索参数时

    【讨论】:

    • 这“有效”但在这种情况下会产生完全不直观的行为。作为用户,人们会期望输入“first_name last_name”会产生相应的用户。使用此方法不起作用,因为 ransack 将尝试在 first_name 中搜索“first_name last_name”。
    【解决方案3】:

    另一种方法是搜索模型的每个属性,只排除您不想要搜索的字段。为此,您可以创建一个自定义帮助器方法,该方法构建 Ransack 的搜索方法所期望的标签和搜索字段名称。以下方法(位于帮助程序中)返回您希望以 Ransack 期望的方式搜索的所有属性的串联:

    def most_attributes_cont
      most_attributes = []
      attributes_to_exclude = [
        "id",
        "created_at",
        "updated_at"
      ]
      ModelName.column_names.each do |column_name|
        most_attributes << column_name unless column_name.in?(attributes_to_exclude)
      end
      most_attributes.join("_or_") + "_cont"
    end
    

    然后,只需将方法调用添加到您的搜索表单:

    <%= search_form_for @q do |f| %>
      <%= f.label most_attributes_cont %>
      <%= f.search_field most_attributes_cont %>
      <%= f.submit %>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2013-05-22
      • 2015-02-15
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多