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

nac*_*10f 5 activerecord ruby-on-rails ruby-on-rails-3

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

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

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

请帮忙.

njo*_*den 8

This looks like a problem that would be better suited to using search rather than SQL. Have you considered something like thinking sphinx or act as ferret (solr would probably be overkill).

...if you must do this in sql, you could build a query something like this:

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)
Run Code Online (Sandbox Code Playgroud)


小智 5

我同意之前的建议,如果你需要进行搜索,你应该看看 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
Run Code Online (Sandbox Code Playgroud)

第 1 步的答案是使用 Ruby 的一个很棒的小功能,称为“splat 运算符”,它允许您获取一个数组并将其作为参数列表进行计算。

第 2 步的答案是修改从参数返回的查询字符串,并将其转换为可以与 LIKE 运算符一起使用的内容。我基本上是从Railscasts Simple Search Form 剧集中偷来的。