ted*_*ear 3 ruby ruby-on-rails ruby-on-rails-4 rails-activerecord
我正在尝试在我的 rails 应用程序中按名字和姓氏搜索用户,并且目前我尝试的每种方法都得到了不同的结果。有没有办法重写这些方法中的任何一个以获得我想要的结果?
用户控制器.rb
方法#1
def self.search(query)
where("first_name LIKE ? OR last_name LIKE ?", "%#{query}%", "%#{query}%")
end
Run Code Online (Sandbox Code Playgroud)
这适用于名字或姓氏,但不适用于两者。
方法#2
def self.search(keywords)
if keywords
where(:all, :conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"])
end
end
Run Code Online (Sandbox Code Playgroud)
这不会返回任何结果
方法#3
def self.search(search)
if search
select('(first_name || " " || last_name) as \'ful_name\', *')
where ['first_name LIKE :s OR last_name LIKE :s OR ful_name LIKE :s', :s => "%#{search}"]
else
scoped
end
end
Run Code Online (Sandbox Code Playgroud)
这将返回错误
SQLite3::SQLException: 没有这样的列:ful_name: SELECT "users".* FROM "users" WHERE (first_name LIKE '%Spider Man' OR last_name LIKE '%Spider Man' OR ful_name LIKE '%Spider Man') ORDER BY created_at发展研究中心
app/views/users/index.html.erb:5:在`_app_views_users_index_html_erb__848623016_40254132'
index.html.erb
<% provide(:title, 'Search') %>
<h1>Search</h1>
<ul class="span4 users">
<%= render @users %>
</ul>
Run Code Online (Sandbox Code Playgroud)
_user.html.erb
<li>
<%= image_tag user.avatar(:medium) %>
<h4><%= link_to user.full_name, feed_user_path(user), :class => "follow-color" %></h4>
<% if current_user.admin? && !current_user?(user) %>
| <%= link_to "delete", user, method: :delete,
data: { confirm: "You sure?" } %>
<% end %>
</li>
Run Code Online (Sandbox Code Playgroud)
_header.html.erb
<%= form_tag users_path, method: "get", class: "search-bar" do %>
<%= text_field_tag :search, params[:search], placeholder: "Search" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这个:
:conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"]
Run Code Online (Sandbox Code Playgroud)
不会工作,因为你有一个(阴险的)报价问题。在 Ruby 中,这个:
"a" "b"
Run Code Online (Sandbox Code Playgroud)
是相同的:
"ab"
Run Code Online (Sandbox Code Playgroud)
所以你:conditions真的是这样的:
:conditions => ["concat(first_name,,last_name) like?", "%#{keywords}%"]
Run Code Online (Sandbox Code Playgroud)
你的意思是说:
:conditions => ["concat(first_name, ' ', last_name) like ?", "%#{keywords}%"]
Run Code Online (Sandbox Code Playgroud)
SQL 中的字符串文字使用单引号,而不是双引号。此外,如果您使用的是声称支持标准 SQL 的数据库,则应使用||运算符进行字符串连接:
:conditions => ["first_name || ' ' || last_name like ?", "%#{keywords}%"]
Run Code Online (Sandbox Code Playgroud)
第三个将不起作用,因为 SELECT 子句中定义的别名在 WHERE 子句中通常不可用,因此会出现“未知列”错误。你也扔掉了select调用的结果,所以我认为你.在这里也错过了:
select('(first_name || " " || last_name) as \'ful_name\', *')
where ['first_name LIKE :s OR last_name LIKE :s OR ful_name LIKE :s', :s => "%#{search}"]
Run Code Online (Sandbox Code Playgroud)
还有一个潜在的引用问题:字符串文字在 SQL 中使用单引号,双引号用于标识符。你只想说:
where("first_name like :s or last_name like :s or first_name || ' ' || last_name like :s", :s => "%#{search}")
Run Code Online (Sandbox Code Playgroud)
要不就:
where("first_name || ' ' || last_name like :s", :s => "%#{search}")
Run Code Online (Sandbox Code Playgroud)
几个警告:
||但是,根据配置,MySQL 想要使用该concat功能。AFAIK,SQLite 支持很多 MySQL 主义,但是您在使用它们时需要注意,并且应该尽可能地遵守标准。| 归档时间: |
|
| 查看次数: |
2936 次 |
| 最近记录: |