Rails搜索表单,可以搜索多个模型的许多属性

时间:2016-01-11 22:57:37

标签: ruby-on-rails ruby-on-rails-4 search-form

我正在创建一个Rails应用程序,用户可以在其中发布链接到他们在网络上的实时网站,以及网站的内容和编码的编程语言。

我正在尝试创建一个可以搜索一些内容的搜索表单:

(1)发布链接的URL (2)编程语言 (3)用户名

我有链接和用户模型。

class Link < ActiveRecord::Base
belongs_to :user

    def self.search(search)
        where("language LIKE ?", "%#{search}%")
        where("url LIKE ?", "%#{search}%")
    end
end

class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

has_many :links

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

我的用户和链接控制器索引方法如下:

class LinksController < ApplicationController
before_action :set_link, only: [:show, :edit, :update, :destroy, :upvote]
before_filter :authenticate_user!, except: [:index, :show]

def index
    @links = Link.search(params[:link])
end

class UsersController < ApplicationController

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

我如何将所有搜索职责委托给一个搜索栏。本质上我只想让搜索栏能够搜索我上面提到的3个属性。我打算将它放在index / layouts / application.html.erb文件夹中。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

所以,如果我理解正确的话:

您应该为搜索引擎控制页面设置控制台,例如SearchController仅执行index操作。

比创建像Search.rb

这样的模型
Search = Struct.new(:search_text) do
  def run
    users = User.where(name: search_text)
    links = Link.where(title: search_text)
    {users: users, links: links}
  end
end

控制器:

def index
  @result = Search.run(params[:search])
end

所以这只是一个例子,您应该根据自己的需要进行修改。

修改

在视野中(苗条):

b User List
ul
  - @result[:users].each |user|
    = user.name

links

相同

答案 1 :(得分:0)

如果您有大量数据,您可能想要查看的另一个涉及的解决方案是SQL中的freetext search

可以跨多个表执行此操作,并按照thoughtbot in their blog所述将其与rails集成。