2015-06-18 251 views
4

我试图在我的Rails应用程序中实现自定义搜索功能。Ruby on Rails中的自定义搜索

我有3个表UserCompanyCompanyUser

宣布我的关系如下

class CompanyUser < ActiveRecord::Base 

    belongs_to :company 
    belongs_to :user 
... 
end 

在Company.rb

has_many :company_users, dependent: :destroy 
has_many :users, through: :company_users 

在User.rb

has_many :company_users, dependent: :destroy 
has_many :companies, through: :company_users 

和在我的查看页面我列出了所有使用company_users表的公司 现在我有一个搜索字段,我可以在其中键入一个名称来过滤公司用户列表。

我打电话从我CompanyUsers表的方法来过滤搜索结果这样

@company_users = CompanyUser.all 
if params[:search_data].present? 
    @company_users = @company_users.filter_company_users(params[:search_data]) 
end 

其中PARAMS [:search_data]传递给同样的方法,当在搜索栏中输入搜索数据。

这是做搜索过滤的方法。眼下

def self.filter_company_users(search_data) 
    where('company_id like (?)', "%#{search_data}%") 
end 

我能得到的结果只有当我在搜索字段中键入CompanyUser表的正确id。我想要做的是使用用户表和公司表中的字段进行搜索。例如来自用户的email和来自公司的name

+0

Nopes ..我之前试过..它给错误。 –

回答

3
class CompanyUser 
    def self.search(search_data) 
    search = self.joins(:company, :user) 
    search.where!('company_users.company_id LIKE :query OR users.email LIKE :query OR companies.name LIKE :query', query: "%#{search_data}%") 
    search 
    end 
end 

随着你与公司和用户加入CompanyUserjoin声明,因此,你将能够在该表中应用滤镜了。

where条件重复使用相同的查询字符串,并将OR中的搜索应用于要搜索的所有列。

+0

谢谢!它确实有帮助.. –

1
@company_users = CompanyUser.all 
@copany_users.all(:conditions => ["company_id LIKE ? OR company.email like ? OR user.name LIKE ?","%#{params[:search_data]}%","%#{params[:search_data]}%", "%#{params[:search_data]}%" ]) 

def self.filter_company_users(search_data) 
where("company_id LIKE ? OR company.email like ? OR user.name LIKE ?" ,"%#{search_data}%", "%#{search_data}%","%#{search_data}%") 
end 
+2

除非您加入,否则无法查询其他表格。此外,第一个查询使用了最近Rails版本中不再支持的'all'方法的一个非常古老的签名。 –