2013-10-15 67 views
0

我试图在我的rails应用程序中创建一个搜索表单。我查了各种解决方案,但他们对我来说毫无意义。学习在Rails中搜索

当我在导轨应用程序中通过窗体运行搜索时,出现以下错误。现在我的关注点(除了错误)是我的索引操作中的实例变量@computers。我很确定这不是'轨道'来正确完成搜索,并会喜欢一些建议。

错误

undefined method `%' for #<Array:0x5780460> 

参数搜索

http://localhost:3000/computers?utf8=%E2%9C%93&direction=&sort=&search=bob 

搜索表单后

<%= form_tag computers_path, method: "get" do %> 
     <%= hidden_field_tag :direction, params[:direction] %> 
     <%= hidden_field_tag :sort, params[:sort] %> 
     <%= text_field_tag :search, params[:search] %> 
     <%= submit_tag "Go", name: nil, class: "btn btn-primary" %> 
<% end %> 

呼叫的方法

def index 
    @computers = Computer.where(school_id: current_user.school_id).search(params[:search]).category(params[:category]).order(sort_column + " " + sort_direction) 
end 

方法

def Computer.search(search) 
    if search 
     search = search.downcase 
     params = [] 
     values = {} 

     column_names.each do |c| 
     params << "#{c} LIKE #{c.to_sym}" 
     values[c.to_sym] = search 
     end 

     params.join (' OR ') 
     where(params,values) 
    else 
     all 
    end 
    end 
+0

发布您的代码。 –

+0

什么行会抛出该错误? –

+0

其中(params,values),当我定义同样的方法时,它在轨道控制台中也发生了孤立。 – Corey

回答

0

你有正确的想法,但调用.join方法不改变它被调用的对象,它只是返回字符串表示。您需要将返回值存储在变量中,如下所示:paramsStr = params.join(' OR ')。然后简单地通过paramsStr到where子句。

最终,这是什么导致你的unidentified method % for Array ....错误;这个版本的where方法期望第一个参数是一个字符串。查看this documentation,关于占位符条件的部分。

希望有所帮助。

+0

至于方法本身,我个人从来没有这样做过搜索,但从我所知道的情况来看,我认为这种方法很好。我相信你可以找到重构它的方法,但是否则,我不知道如何在纯SQL中执行这样的方法,而无需编写过程或手动编写每列。 –

+1

这有助于非常感谢你。现在看来很明显,你指出了这一点。谢谢! – Corey