Ruby on rails 宝石搜索不';使用全名搜索时,不会返回任何结果

Ruby on rails 宝石搜索不';使用全名搜索时,不会返回任何结果,ruby-on-rails,ruby,ransack,Ruby On Rails,Ruby,Ransack,我正在使用Ransack和Rails 3 我的看法: <%= 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 o

我正在使用Ransack和Rails 3

我的看法:

  <%= 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 %>
关于用户模型,我有:

  def full_name
    "#{self.first_name} #{self.last_name}"
  end
在控制台上工作

如果我的用户具有
first\u name=“Foo”
last\u name=“Bar”
,当我使用其中一个进行搜索时,我会得到预期的结果

当我使用
full\u name=“Foo Bar”
搜索时,没有得到任何结果

我尝试将我的文本字段更改为:

<%= f.text_field :first_name_or_last_name_or_company_or_full_name_cont

我想我可以在这里拆分键值,只搜索名字

您必须使用
洗劫器
。将此添加到您的
用户
型号中:

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

您可以查看更多示例

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

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 %>

洗劫者的部分是从飞机上取下来的


使用PostgreSQL在Rails 4.2上进行测试。

感谢您为我指明了正确的方向。您的示例不适用于mysql。我跟随你的链接,尝试了一个成功的例子。也就是说:ransacker:full_name do | parent | Arel::Nodes::NamedFunction.new('concat_ws',['',parent.table[:first_name],parent.table[:last_name]])end您在使用mysql吗?“因为我也试过同样的方法,但没有成功。”JacobFrye检查你上面curts评论中的代码。也许它会对你有用。但是,我已经用Rails 4.2和PostgresSQL对其进行了测试,如果搜索以空格分隔的名字和姓氏,就会出现问题。例如:
first\u name
是“John”,
last\u name
是“Doe”。如果我们只搜索“John”或“Doe”,它会起作用。然而,如果我们搜索“约翰·多伊”,它将什么也找不到。我们需要在Ransacker中添加空格字符。我将创建并回答说明。请不要发布多个问题。发布一个好的答案,然后投票/标记以重复结束其他问题。如果这个问题不是重复的,那就根据你的问题量身定做你的答案。@Kyl:很抱歉。我已经照你的建议做了。
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 %>