在开发环境中,Rails查询在视图和控制器中都能正常工作,但在生产环境中只能在视图中正常工作。

3

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


1
请展示实际的“搜索”方法,并告诉我们在开发和生产中使用的数据库系统。我怀疑它们是不同的。 - Ryan Bigg
我添加了“search”方法的代码。生产环境中的两个数据库系统都是MySQL。谢谢!在生产环境中,当搜索在视图文件中时,搜索确实可以正常工作。但是当它在控制器中时就不行了。 - kevin1
未来请注意:对于多行代码,请使用四个空格缩进。 - Ryan Bigg
1
你能否在生产环境中在上述搜索方法中放置一个日志记录语句,并确认毫无疑问地,该方法被视图和控制器都调用了吗? - mccannf
@mccannf 我已经更改了方法名称进行检查,结果是相同的。我现在刚刚通过以下方式暂时解决了问题:将所有代码直接移动到视图中,并使用 params[:search] 替换了 sessions[:search]。(我之前使用会话变量进行搜索以便在其他地方重用。)使用 params 或直接在搜索中输入字符串可以完美地工作。我不明白为什么我的会话变量在生产环境中表现不佳,而在开发环境中却没有问题。 - kevin1
1个回答

0

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

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


我经常更改方法和对象的名称并重新部署,但结果始终相同。正如我在上面评论的那样,我已经能够确定问题部分地出现在生产环境中的会话变量中。当传递给该方法时,我不知道session[:search].to_s(以及其他变体)与params[:search]产生不同的结果。会话变量是通过session[:search] = params[:search]早期设置的。然而,进行切换后,我的应用程序在生产环境中开始工作了。 - kevin1
我还注意到另外几个地方,我的会话变量在生产环境中表现不佳,但在开发环境中运行顺畅。我不明白为什么... - kevin1
дҪ еҸҜд»Ҙе°қиҜ•еңЁеёғеұҖжҲ–зү№е®ҡи§Ҷеӣҫдёӯж·»еҠ <%= session.inspect %>жқҘи·ҹиёӘе®ғеңЁжөҒзЁӢдёӯзҡ„еҸҳеҢ–гҖӮ - Nathan
我添加了 <%= session.inspect %>,现在我看到在开发环境中一些会话变量被正确设置,但在生产环境中没有。我似乎无法弄清楚原因。 - kevin1
结果发现我在开发中忽略了一个旧版本的文件,但它在生产环境中引起了冲突。 - kevin1
@kevin:太好了——很高兴你找到了解决方案! - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接