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

时间:2010-10-26 19:29:13

标签: ruby-on-rails activerecord ruby-on-rails-3

我希望我的代码执行两项当前没有做的事情

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

  2. 实际上使用Like子句而不是严格的同等条款。

  3. 请帮助。

3 个答案:

答案 0 :(得分:8)

这看起来像是一个更适合使用搜索而不是SQL的问题。您是否考虑过像thinking sphinxact as ferret这样的事情(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)

答案 1 :(得分:4)

我同意之前的建议,如果你需要做搜索,你应该看看像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的一个很棒的小功能,称为“splat operator”,它允许你获取一个数组并将其作为参数列表进行评估。

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

答案 2 :(得分:1)

我不确定您是否希望所有字段都搜索相同的字词,如果 的话,那么您可以这样做:

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

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