我是rails的新手,所以我的问题可能很简单。我正在使用rails 3.2.3。我有以下代码来在我的数据库上执行搜索:
@search_results = User.search("test search")
其中search
在我的模型中定义。当@search_results = Data.search("test search")
在我的开发环境的视图或控制器中时,这段代码对我来说完美无缺。在生产中,它在视图中可以工作,但在控制器中不能。我不知道为什么。查看我的生产日志,视图和控制器的SQL有很大的区别:
当查询来自生产中的视图时,这是我在日志中看到的内容:
SELECT 'users'.* FROM 'users' WHERE (concat(field1, ' ', field2, ' ', field3) LIKE '%test%' AND concat(field1, ' ', field2, ' ', field3) LIKE '%search%'
那正是我所需要的。但是,当查询来自控制器时,SQL 语句会变成这样:
SELECT 'users'.* FROM 'users' WHERE (field1 LIKE '%test search%' OR field2 LIKE '%test search%' OR field3 LIKE '%test search%')
我不理解我的控制器在生产环境中做了什么来创建这个变化。
编辑-这里是
search
方法:def self.search(search)
if search
search_length = search.split.length
find(:all, :conditions => [(["concat(field1, ' ', field2, ' ', field3) LIKE ?"] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" })
else
find(:all)
end
end
我在生产和开发环境中都使用MySQL。
params[:search]
替换了sessions[:search]
。(我之前使用会话变量进行搜索以便在其他地方重用。)使用 params 或直接在搜索中输入字符串可以完美地工作。我不明白为什么我的会话变量在生产环境中表现不佳,而在开发环境中却没有问题。 - kevin1