首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试图通过first_name和last_name进行搜索

试图通过first_name和last_name进行搜索
EN

Stack Overflow用户
提问于 2014-09-20 04:27:20
回答 2查看 3.9K关注 0票数 3

我试图在我的rails应用程序中用名字和姓氏搜索一个用户,目前我尝试的每一种方法都得到了不同的结果。有什么方法可以重写这些方法来获得我想要的结果吗?

user_controller.rb

方法1

代码语言:javascript
复制
def self.search(query)
  where("first_name LIKE ? OR last_name LIKE ?", "%#{query}%", "%#{query}%") 
end

这适用于名字或姓氏,但两者都不适用。

方法2

代码语言:javascript
复制
def self.search(keywords)
  if keywords
    where(:all, :conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"])
  end
end

这不会返回任何结果

Method#3

代码语言:javascript
复制
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

这将返回错误

SQLite3 3::SQLException:没有这样的列: ful_name:从“用户”中选择“用户”.* (first_name喜欢‘%蜘蛛侠’或last_name像‘%蜘蛛侠’或ful_name像‘%蜘蛛侠’) app/views/users/index.html.erb:5:in `_app_views_users_index_html_erb__848623016_40254132‘

index.html.erb

代码语言:javascript
复制
<% provide(:title, 'Search') %>
<h1>Search</h1>

<ul class="span4 users">
  <%= render @users %>
</ul>

_user.html.erb

代码语言:javascript
复制
<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>

_header.html.erb

代码语言:javascript
复制
<%= form_tag users_path, method: "get", class: "search-bar" do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search" %>
<% end %>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-20 04:54:21

这个:

代码语言:javascript
复制
:conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"]

不会起作用,因为你有一个(阴险的)报价问题。在Ruby中,这个:

代码语言:javascript
复制
"a" "b"

与以下相同:

代码语言:javascript
复制
"ab"

所以你的:conditions是这样的:

代码语言:javascript
复制
:conditions => ["concat(first_name,,last_name) like?", "%#{keywords}%"]

你是说:

代码语言:javascript
复制
:conditions => ["concat(first_name, ' ', last_name) like ?", "%#{keywords}%"]

SQL中的字符串文字使用单引号,而不是双引号。此外,如果使用声称支持标准SQL的数据库,则应该使用||操作符进行字符串连接:

代码语言:javascript
复制
:conditions => ["first_name || ' ' || last_name like ?", "%#{keywords}%"]

第三个不能工作,因为SELECT子句中定义的别名通常在WHERE子句中不可用,因此出现了“未知列”错误。您还丢弃了select调用的结果,因此我认为您在这里也遗漏了一个.

代码语言:javascript
复制
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}"]

还有一个潜在的引用问题:字符串文本在SQL中使用单引号,双引号用于标识符。你想说的是:

代码语言:javascript
复制
where("first_name like :s or last_name like :s or first_name || ' ' || last_name like :s", :s => "%#{search}")

或者只是:

代码语言:javascript
复制
where("first_name || ' ' || last_name like :s", :s => "%#{search}")

有几个注意事项:

  1. 字符串连接操作符是特定于数据库的.标准SQL使用||,但根据配置,MySQL希望使用concat函数。AFAIK,SQLite支持很多MySQL--但是当你使用它们的时候你需要知道,并且你应该尽可能地遵守标准。
  2. 同样,引用也是特定于数据库的.标准SQL将单引号用于字符串文本,双引号用于标识符(如表名和列名)。MySQL对标识符使用回签,SQLite (AFAIK)允许您对标识符使用双引号或回签,对字符串使用单引号或双引号。再一次,尽量坚持标准,养成好习惯。
票数 6
EN

Stack Overflow用户

发布于 2020-02-04 15:59:35

我也想做同样的事情,我遵循了一个很好的教程:https://www.youtube.com/watch?v=s88Uc0InOAM

然后我遇到了和你一样的问题,我想用名字和姓氏来搜索。这是我所做的,也是起作用的:

代码语言:javascript
复制
    @indiens = Indien.where("name LIKE ?", "%" + params[:q] + "%" ).or(Indien.where("surname LIKE ?", "%" + params[:q] + "%" ))

这可能会连锁更多,但我没有测试。

我知道已经过去5年了,也许它会对别人有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25945227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档