【问题标题】:Gem Ransack doesn't return any results when searched with full name使用全名搜索时,Gem Ransack 不返回任何结果
【发布时间】:2014-11-12 15:33:22
【问题描述】:

我在 Rails 3 中使用 Ransack。

我的看法:

  <%= search_form_for @search do |f| %>
    <%= f.text_field :first_name_or_last_name_or_company_cont, :style => 'width:150px;padding-top:6px;' %><p class="button">
    <%= f.submit "Search by name or company" %></p>
  <% end %>

我的架构:

create_table "users", :force => true do |t|
    t.string   "first_name",                  
    t.string   "last_name"

在我拥有的用户模型上:

  def full_name
    "#{self.first_name} #{self.last_name}"
  end

在控制台上工作。

如果我有 first_name = "Foo", last_name = "Bar" 的用户,当我使用其中一个进行搜索时,我会得到预期的结果。

当我使用 full_name = "Foo Bar" 搜索时,我没有得到任何结果。

我尝试将 Ransack 的 text_field 更改为:

<%= f.text_field :first_name_or_last_name_or_company_or_full_name_cont

我收到first_name_or_last_name_or_company_or_full_name_cont is undefined

有没有一种快速的方法来解决这个问题,而无需在我的用户表上为 full_name 添加另一列?

还有:

     7: def index
     8:   search_params = params[:q]
 =>  9:   binding.pry

[1] pry(#<UsersController>)> search_params
=> {"first_name_or_last_name_or_company_cont"=>"Foo Bar"}

我想我可以在这里拆分键值以仅搜索名字。

【问题讨论】:

    标签: ruby-on-rails ruby ransack


    【解决方案1】:

    您必须使用Ransacker。将此添加到您的 User 模型中:

    ransacker :full_name do |parent|
      Arel::Nodes::InfixOperation.new('||',
        parent.table[:first_name], parent.table[:last_name])
    end
    

    您可以查看Ransack GitHub wiki 以获取更多示例。

    【讨论】:

    • 感谢您为我指明正确的方向。您的示例不适用于 mysql。我按照您的链接并尝试了一个确实有效的示例。即: ransacker :full_name do |parent| Arel::Nodes::NamedFunction.new('concat_ws', [' ', parent.table[:first_name], parent.table[:last_name]]) end
    • 你在用mysql吗?因为我尝试了同样的方法但没有运气。
    • @JacobFrye 检查您上面简短评论中的代码。也许它也适合你
    • 谢谢。但是,我已经使用 Rails 4.2 和 PostgresSQL 对其进行了测试,如果您搜索名字和姓氏以空格分隔,则会出现问题。示例:first_name 是“John”,last_name 是“Doe”。如果我们只搜索“John”或只搜索“Doe”,它会起作用。但是,如果我们搜索“John Doe”,它不会找到任何东西。我们需要在 Ransacker 中添加空格字符。我将创建并回答说明它。
    【解决方案2】:

    将以下代码添加到您的模型中:

    ransacker :full_name do |parent|
      Arel::Nodes::InfixOperation.new('||',
        Arel::Nodes::InfixOperation.new('||',
          parent.table[:first_name], Arel::Nodes.build_quoted(' ')
        ),
        parent.table[:last_name]
      )
    end
    

    ...以及您认为的以下内容:

    <%= f.label :full_name %><br>
    <%= f.search_field :full_name_cont %>
    

    ransacker 部分取自Ransack wiki

    使用 PostgreSQL 在 Rails 4.2 上测试。

    【讨论】:

    • 请不要在多个问题上发帖identical answers。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答。
    • @Kyll:很抱歉。我已经按照你的建议做了。
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多