在一个搜索字段中搜索多个单词

时间:2013-04-08 07:46:12

标签: ruby-on-rails-3.2 ransack

需要一些帮助

我有一个用户模型和一个具有has_one关系的个人资料模型(用户有一个个人资料,个人资料只属于一个用户,非常基本,非常简单)。

我想做那样的事情:

 User.search({:profile_last_name_or_profile_first_name_cont_any=> 'jane doe'.split(' ')}).result

生成的SQL是以下

"SELECT "users".* FROM "users" LEFT OUTER JOIN "profiles" ON "profiles"."user_id" = "users"."id" WHERE ((("profiles"."last_name" ILIKE '%jane%' OR "profiles"."last_name" ILIKE '%doe%') OR ("profiles"."first_name" ILIKE '%jane%' OR "profiles"."first_name" ILIKE '%doe%')))"

返回预期结果...但是如何在我的搜索表单(在我的视图中)和/或在我的控制器中实现此请求?

我的搜索表单是:

<%= search_form_for @q, url: search_cockpit_users_path, method: 'post', id: 'users-search-form', class: 'span3 pull-right' do |su| %>
      <%= su.text_field :profile_last_name_or_profile_first_name_or_email_cont_any, :placeholder => 'full name or email contains' %>
      <%= su.submit 'Search', :name => nil, :class => 'btn ' %>
  <% end %>

因为返回的SQL是

"SELECT "users".* FROM "users" LEFT OUTER JOIN "profiles" ON "profiles"."user_id" = "users"."id" WHERE ((("profiles"."last_name" ILIKE '%jane doe%') OR ("profiles"."first_name" ILIKE '%jane doe%')))"

但是如何实现split('')以获得预期的SQL?

任何帮助(以及一些解释)都会很棒,文档对这个主题有点了解......

干杯

编辑来自wintermeyer的评论

@wintermeyer 以下是您要求的代码片段。我真的不明白为什么你需要它们,问题不在搜索过程中,只用一个单词就可以正常工作。我的问题是如何拆分查询字符串以获得预期生成的SQL。

涉及的控制器部分是

class Cockpit::UsersController < ApplicationController
  def index
    @q = User.joins(:profile).search(params[:q])
    @pp = params[:pp] ? params[:pp].to_i : 10
    @users = @q.result.paginate(:per_page => @pp, :page => params[:page])

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
      format.js { @users }
    end
  end

  def search
    @q = User.joins(:profile).search(params[:q])

    @pp = params[:pp] ? params[:pp].to_i : 10
    @users = @q.result.paginate(:per_page => @pp, :page => params[:page])
    render "index"
  end
end

路线的一部分

namespace :cockpit do
    root :to => "dashboard#index"

    resources :users do
      member do
        get 'toggle_remove'
      end

      collection do
        get 'bulk'
        match 'search', to: "users#search", via: [:get, :post], as: 'search'
      end

      resources :profiles
    end
  end 

0 个答案:

没有答案