Ruby on rails Rails-query在开发中的视图和控制器中工作,但仅在生产中的视图中工作

Ruby on rails Rails-query在开发中的视图和控制器中工作,但仅在生产中的视图中工作,ruby-on-rails,controller,production,Ruby On Rails,Controller,Production,我是rails新手,所以我的问题可能有一个简单的答案。我使用的是rails 3.2.3。我有以下代码在我的数据库上执行搜索: @search\u results=User.search(“测试搜索”) 其中,搜索在我的模型中定义。当@search\u results=Data.search(“test search”)在我的开发环境的视图或控制器中时,此代码非常适合我。在生产环境中,它在视图中工作,但在控制器中不工作。我不知道为什么。查看我的生产日志,视图和控制器的SQL有很大区别: 当查询来自

我是rails新手,所以我的问题可能有一个简单的答案。我使用的是rails 3.2.3。我有以下代码在我的数据库上执行搜索:

@search\u results=User.search(“测试搜索”)

其中,
搜索
在我的模型中定义。当
@search\u 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%')
我不明白生产环境中的控制器是如何创建此更改的

编辑这里是
搜索
方法:

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。

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


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

请告诉我们实际的
搜索方法,并告诉我们您在开发和生产中使用的数据库系统。我怀疑它们是不同的。我为
search
方法添加了代码。MySQL生产和环境中的数据库系统。谢谢在生产环境中,当搜索位于视图文件中时,搜索确实可以正常工作。只是当它在控制器中时没有。只是为了将来注意:请对多行代码使用四个空格缩进。您能否在生产中将logger语句放入上面的搜索方法中,并毫无疑问地确认view和controller正在调用相同的方法?@mccannf I更改了要检查的方法的名称,结果是一样的。我刚才暂时解决了这个问题:直接在视图中移动所有代码,并用
params[:search]
替换
sessions[:search]
。(我使用了一个session变量,搜索可以在其他地方重复使用。)使用params或直接在搜索中键入一个字符串可以让它完美地工作。我不明白为什么我的会话变量在生产环境而不是开发环境中表现不好。我经常更改方法和对象的名称并重新部署,但结果都是一样的。正如我在上面所评论的,我已经能够确定问题部分在于生产中的会话变量。我不知道
session[:search].to_s
(以及其他变体)在传递到方法时如何为
params[:search]
生成不同的结果。会话变量是先前由
session[:search]=params[:search]
设置的。然而,切换使我的应用程序在生产环境中得以运行。我还注意到,在其他几个地方,我的会话变量在生产环境中表现不正常,但在开发过程中运行平稳。我不明白为什么……您可以尝试将
添加到布局或特定视图中,以跟踪它在流程中的变化。我添加了
,现在我看到一些会话变量在开发中设置正确,但在生产中没有设置。我似乎不明白为什么。原来我有一个旧版本的文件,在开发中被忽略了,但在生产中造成了冲突。