帮助rails活动记录查询(如子句)

我希望我的代码做两件目前没有做的事情

@students = Student.where(["first_name = ? OR middle_name = ? OR last_name = ?", params[:query].split]) 
  1. 工作。 (它说我应该传递4个参数,但我希望用户能够键入单词并在每个字段上找到这些单词并返回任何匹配项)

  2. 实际上使用Like子句而不是刚性相等的子句。

请帮忙。

这看起来像是一个更适合使用搜索而不是SQL的问题。 你有没有考虑像思考狮身人面像或充当雪貂 (solr可能是矫枉过正的)。

…如果你必须在sql中这样做,你可以建立一个像这样的查询:

 cols = ['first_name', 'last_name', 'middle_name'] query = 'John Smith' sql_query = cols.map{|c| query.split.map{|q| "#{c} like '?'"}}.join(' OR ') sql_query_array = query.split * cols.count Student.where(sql_query, sql_query_array) 

我同意之前的建议,如果你需要做搜索,你应该看看像Solr或Sphinx这样的东西。

无论如何,这应该会帮助你。

 def search query = params[:query].split.map {|term| "%#{term}%" } sql = "first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?" @students = Student.where([sql, *query]) end 

第1步的答案是使用Ruby的一个很棒的小function,称为“splat operator”,它允许你获取一个数组并将其作为参数列表进行评估。

第2步的答案是按下从params返回的查询字符串,并将其转换为可以与LIKE运算符一起使用的字符串。 我基本上从Railscasts Simple Search Form插曲中偷走了这个。

我不确定你是否希望所有字段都搜索相同的术语,如果这种情况,那么你可以这样做:

 where("first_name LIKE :term OR middle_name LIKE :term OR last_name LIKE :term", { term: "%#{params[:term]}%"}) 

不需要任何疯狂的splitmap或其他任何东西,这只是直接的ActiveRecord