2015-06-18 249 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'方法的一個非常古老的簽名。 –