在这方面需要一些帮助
我有一个用户模型和一个具有 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