rails搜索返回dev中的数组,但在heroku生产环境中返回nil

时间:2015-02-12 10:31:04

标签: ruby-on-rails

我创建了一个搜索表单,在我的开发环境中完美运行但在我的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)

1 个答案:

答案 0 :(得分:0)

问题是由数据库中的特殊原因引起的。

rails的本地安装使用SQLite3,它在WHERE子句中不区分大小写。 Heroku的PostgreSQL区分大小写,因此当您查询实际Foo.where('bar LIKE ?', "%baz%")的{​​{1}}时,您将在dev中获得结果,但不会在heroku中获得结果。

最好在比较值之前使用LOWER()。在这种情况下,请替换

bar == 'Baz'

Foo.where('bar LIKE ?', "%baz%")