我正在为我的应用程序处理一个搜索框,我有两个字段firstname和lastname。我为它们创建了一个full_name方法。
配置文件型号:
def full_name
"#{self.firstname} #{self.lastname}"
end
这是我搜索的方法
def self.search_by_full_name(search)
where("(fisrtname || lastname) LIKE :q", :q => "%#{search}%")
end
配置文件控制器:
def index
if params[:search]
@profile = Profile.search_by_full_name(params[:search])
else
@profile = Profile.all
end
结束
您可以将其作为
where("CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{query}%")
或者你可以创建一个范围
scope :search_by_full_name ->(query) { where("CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{query}%") }
做这个简单的技巧
def self.search_by_full_name(search)
@names = search.split(" ")
where("first_name LIKE ? AND last_name LIKE ?", "%#{@names[0]}","%#{@names[1]}" )
end
我遇到了同样的问题,所以,为了涵盖每一个案例场景。
这种情况的最佳解决方案如下
where("CONCAT(first_name,' ',last_name) iLIKE ? OR CONCAT(last_name,' ',first_name ) iLIKE ?", "%#{query}%", "%#{query}%")
p.S.请确保首先在查询中应用squish方法query = search.squish
我的建议和它更接近您的
def self.search_by_full_name(search)
where("fisrtname LIKE :search OR lastname LIKE :search", search: "%#{search}%")
end
这对我很管用。我使用sqlite
您的查询有点错误:
def self.search_by_full_name(search)
where("firstname like :search OR lastname like :search", search: "%#{search}%")
end
您可以执行此
User.where("first_name||' '||last_name ilike :name", :name => "%first_name last_name%")