我创建了一个搜索表单,在我的开发环境中完美运行但在我的heroku实例中无法运行。当我调试时,看起来搜索结果数组在生产中为空。我确保在数据库中有种子数据。
home.html.erb
<%= form_tag("home", method: "get") do %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag 'Search', name: nil %>
<% end %>
<% if @search_results.any? %>
<ul><%= render @search_results %></ul>
<%= will_paginate @search_results %>
<% end %>
static_pages_controller.rb
def home
if params[:search] then
@search_results = Foo.where('bar LIKE ?', "%#{params[:search]}%").paginate(page: params[:page])
else
@search_results = Foo.order("bar DESC").paginate(page: params[:page])
end
end
当我在heroku中运行此代码时,我得到@search_results.any? == false
,因此不会打印任何结果,这在我本地运行时不是这种情况。不确定我错过了什么。
编辑:
它尝试通过rails和heroku上的rails console进行查询。我在相同的种子数据上使用相同的代码,但heroku确实返回nil
。它是否与数据库相关,因为我知道它们使用不同的数据库。这是一行:
Foo.where('bar LIKE ?', "%baz%").paginate(page: 1)
答案 0 :(得分:0)
问题是由数据库中的特殊原因引起的。
rails的本地安装使用SQLite3,它在WHERE子句中不区分大小写。 Heroku的PostgreSQL区分大小写,因此当您查询实际Foo.where('bar LIKE ?', "%baz%")
的{{1}}时,您将在dev中获得结果,但不会在heroku中获得结果。
最好在比较值之前使用LOWER()。在这种情况下,请替换
bar == 'Baz'
与
Foo.where('bar LIKE ?', "%baz%")