如何使用标签中的搜索

问题描述:

我正在使用acts-as-taggable-on宝石。如何使用标签中的搜索

我想用单一搜索领域

我的模型

class User < ActiveRecord::Base 

    acts_as_taggable 
    attr_accessor: :name, :age, :country, tag_list 

    def self.search(search) 
    if search 
     where('name LIKE ?', "%#{search}%") 
    else 
     scoped 
    end 
    end 
end 

控制器同时搜索名称和标签

class UserAppsController < ApplicationController 

    def index 
    @users = User.search(params[:search]) 
    //@users = User.tagged_with(params[:search]) 
    end 
end 

帮我解决这个问题。

一种方法是同时添加使用+导致的彼此

@users = User.search(params[:search]) 
@users = @users + User.tagged_with(params[:search]) 

更好的解决方案将是改变模型中的搜索方法返回完整的结果:

where('name LIKE ?', "%#{search}%") + tagged_with(search) 

但是如果你想从标签搜索中拆分名称搜索,你可以将它们拆分成示波器或类似的东西,然后使用它:

scope :name_contains, -> (query) { where('name LIKE ?', "%#{query}%") } 

,并在你的搜索方法:

name_contains(search) + tagged_with(search) 

顺便说一句,如果你想要的名称搜索不区分大小写使用类似:

scope :name_contains, -> (query) { where("REPLACE (lower(name), ' ', '') like ?", "%#{query.downcase}%") } 
+0

感谢回答。现在,当我们添加两个范围时出现分页问题:“+” – Mano

+0

范围:tagged_with,lambda {| tag | “ { :joins =>”INNER JOIN taggings ON taggings.taggable_id = user.id \ INNER JOIN tags ON tags.id = taggings.tag_id AND taggings.taggable_type ='User'“, :conditions => [”tags .name =?“,tag] } } – Mano

+0

我通过在结果中加入'.order(:id)'解决了tagged_with的分页问题...所以试试'@ users.order(:id)' –