3

我是 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。

4

1 回答 1

0

在我看来,第二个查询是基于您的搜索方法的旧版本。

Rails 不会凭空创建这样的查询,所以我认为您可能在某个地方有旧代码正在生成该查询。确保您已重新启动生产 Rails 应用程序以获取最新的代码更改,并确保您在正确的对象上调用正确的方法。

于 2012-10-30T06:15:39.733 回答