3

在这方面需要一些帮助

我有一个用户模型和一个具有 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 
4

0 回答 0