我是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。
答案 0 :(得分:0)
在我看来,第二个查询基于您之前的搜索方法版本。
Rails不会凭空创建一个类似的查询,所以我认为你可能会在生成该查询的某个地方放置旧代码。确保您已重新启动生产Rails应用程序以获取最新的代码更改,并确保在正确的对象上调用正确的方法。