Ruby on rails 正在尝试按姓和名搜索

Ruby on rails 正在尝试按姓和名搜索,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Activerecord,我在rails应用程序中尝试通过名字和姓氏搜索用户,目前我尝试的每种方法都得到了混合结果。有没有办法重新编写这些方法中的任何一种来获得我想要的结果 用户_controller.rb 方法1 def self.search(query) where("first_name LIKE ? OR last_name LIKE ?", "%#{query}%", "%#{query}%") end 这适用于名字或姓氏,但不能同时适用于两

我在rails应用程序中尝试通过名字和姓氏搜索用户,目前我尝试的每种方法都得到了混合结果。有没有办法重新编写这些方法中的任何一种来获得我想要的结果

用户_controller.rb

方法1

def self.search(query)
  where("first_name LIKE ? OR last_name LIKE ?", "%#{query}%", "%#{query}%") 
end
这适用于名字或姓氏,但不能同时适用于两者

方法2

def self.search(keywords)
  if keywords
    where(:all, :conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"])
  end
end
这不会返回任何结果

方法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
这将返回错误

SQLite3::SQLException:没有这样的列:ful_name:选择用户。*从用户中,通过在DESC

app/views/users/index.html.erb:5:in`_app_views_users_index_html_erb_848623016_40254132'

index.html.erb

<% provide(:title, 'Search') %>
<h1>Search</h1>

<ul class="span4 users">
  <%= render @users %>
</ul>
_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>
<%= form_tag users_path, method: "get", class: "search-bar" do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search" %>
<% end %>
_header.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>
<%= form_tag users_path, method: "get", class: "search-bar" do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search" %>
<% end %>
这个:

:conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"]
因为你有一个隐秘的报价问题,所以不起作用。在Ruby中,这是:

"a" "b"
同:

"ab"
所以你的条件是:

:conditions => ["concat(first_name,,last_name) like?", "%#{keywords}%"]
你的意思是说:

:conditions => ["concat(first_name, ' ', last_name) like ?", "%#{keywords}%"]
SQL中的字符串文字使用单引号,而不是双引号。此外,如果您使用的数据库声称支持标准SQL,则应使用| |运算符进行字符串连接:

:conditions => ["first_name || ' ' || last_name like ?", "%#{keywords}%"]
第三个不起作用,因为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}"]
还有一个潜在的引用问题:字符串文本在SQL中使用单引号,双引号用于标识符。你只想说:

where("first_name like :s or last_name like :s or first_name || ' ' || last_name like :s", :s => "%#{search}")
或者只是:

where("first_name || ' ' || last_name like :s", :s => "%#{search}")
有几点需要注意:

字符串连接运算符是特定于数据库的。标准SQL使用| |,但根据配置的不同,MySQL希望使用concat函数。顺便说一句,SQLite支持很多MySQL ISM,但是在使用它们时需要注意,并且应该尽可能地遵守标准。 引用也是数据库特有的。标准SQL对字符串文本使用单引号,对表名和列名等标识符使用双引号。MySQL对标识符使用反引号,SQLite AFAIK允许对标识符使用双引号或反引号,对字符串使用单引号或双引号。再次强调,尽可能坚持标准,养成良好习惯。
我也想做同样的事,我跟着这首好歌跳:

然后我遇到了和你一样的问题,我想搜索姓名和姓氏。 这就是我所做的,它正在发挥作用:

    @indiens = Indien.where("name LIKE ?", "%" + params[:q] + "%" ).or(Indien.where("surname LIKE ?", "%" + params[:q] + "%" ))
也许可以链接更多,但我没有测试


我知道这已经5年了,也许它会帮助其他人。

first varitan看起来是正确的,但你是什么意思?这对名字或姓氏有效,但不能同时对两者都有效?它将根据我在数据库中的名字或姓氏字符串进行搜索,但对名字+姓氏无效_name@RichPeck:谢谢。我觉得简单的dox答案不对。