使用全名搜索时,Gem Ransack不会返回任何结果

时间:2014-11-12 15:33:22

标签: 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 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"进行搜索时,我得不到任何结果。

我尝试将我的text_field更改为Ransack:

<%= 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"}

我想我可以在这里拆分键值来搜索第一个名字。

2 个答案:

答案 0 :(得分:6)

您必须使用Ransacker。在User模型中添加此内容:

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

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

答案 1 :(得分:0)

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

shutdown.bat

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

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

ransacker部分取自Ransack wiki

使用PostgreSQL在Rails 4.2上测试。