如何使用搜索作为可标记的行为

时间:2015-10-15 06:59:43

标签: ruby-on-rails-3 ruby-on-rails-3.2 acts-as-taggable-on acts-as-taggable

我正在使用acts-as-taggable-on gem。

我想在单个搜索字段中使用搜索名称和标签

我的模特

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

帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

一种方法是使用+:

将两个结果相互添加
@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}%") }