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



我制作了一个搜索表单,它在我的开发环境中运行良好,但在我的heroku实例中不起作用。当我调试时,搜索结果数组在生产中看起来是null。我确保数据库中有种子数据。

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 %>

静态页面控制器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,因此不会打印结果,而在本地运行时则不是这样。不确定我错过了什么。

编辑:

它尝试在dev和heroku上通过rails控制台进行查询。我在相同的种子数据上使用了相同的代码,但heroku确实返回了nil。是不是与数据库有关,因为我知道他们使用不同的数据库。这是一条线:

Foo.where('bar LIKE ?', "%baz%").paginate(page: 1)

该问题是由数据库中的特性引起的。

rails的本地安装使用SQLite3,当涉及到WHERE子句时,它不区分大小写。Heroku的PostgreSQL是区分大小写的,所以当你查询Foo.where('bar LIKE ?', "%baz%")(实际上是bar == 'Baz')时,你会在dev中得到结果,但在Heroku中没有。

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

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

带有

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

最新更新