2016-06-13 46 views
0

我試圖對我的rails模型中的以下字段進行搜索:id,description,notes和customer_name。通過Rails中的id和其他字段搜索表

在我的模型TechServiceSpecial

def self.search(params) 
    q = "%#{params[:search].try(:strip).tr('%', '')}%" 

    #build up general search 
    general_search_fields.reduce(nil) do |running_query, field| 
    if field =~ /id/ 
     main_check = arel_table[field].eq(q.to_i) 
    else 
     main_check = arel_table[field].matches(q) 
    end 

    if running_query.nil? 
     main_check 
    else 
     running_query.or(main_check) 
    end 
    end 
end 

private 

def self.general_search_fields 
    %i(id description notes customer_name) 
end 

在我的控制器(我用雷的分頁):

def search 
    specials = TechServiceSpecial.where(TechServiceSpecial.search(params)) 
    @tech_service_specials = specials.page(params[:page]).per(200) 
    render 'index' 
end 

,如果我搜索使用一個id這將不記錄。因此,如果我有一個ID爲1005的記錄,那麼該記錄將不會返回到「1005」的搜索結果中,除非說明,備註或客戶名稱中也有1005個記錄。在說明,筆記或customer_name中恰好有1005的任何記錄都會被返回。

所以,我調整了控制器看起來像這樣:

def search 
    specials = TechServiceSpecial.where(TechServiceSpecial.search(params)) 
    specials.merge(TechServiceSpecial.where(id: params[:search].to_i)) 
    @tech_service_specials = specials.page(params[:page]).per(200) 
    render 'index' 
end 

,但我得到了相同的結果。不會返回ID爲1005的記錄。

如何使此返回記錄的id等於我正在搜索的字符串?

回答

0

在你TechServiceSpecial.search方法:

q = "%#{params[:search].try(:strip).tr('%', '')}%" 
... 
if field =~ /id/ 
    main_check = arel_table[field].eq(q.to_i) 
... 

的ID值將始終爲0,因爲q開始用 「​​%」。

如果該字段爲id,則應設置qparams[:search].to_i