2016-06-13 45 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