Ruby on Rails - 搜索功能不会在一列上返回结果

时间:2015-06-23 21:30:05

标签: ruby-on-rails ruby postgresql

我正在我的Rails应用程序中实现'where'搜索,并且它能够搜索除其中一个之外的所有数据库列。我已经研究了很长一段时间,但无法弄清楚为什么会这样。

我目前完全在我的控制器中构建搜索操作,如下所示:

def search_results
    keywords = "%"+params[:search_keywords]+"%"
    @found_prospects = Prospect.where("current_role LIKE ?", keywords)
end

在我看来,用户通过表单搜索:

<%= form_tag search_results_path, method: 'get' do %>
    <%= text_field_tag :search_keywords %>
    <%= submit_tag "Search" %>
<% end %>

然后使用上面的@found_prospects变量生成一个表,如下所示。

<% @found_prospects.each do |prospect| %>
    <tr>
       <td><%= prospect.id %></td>
       <td><%= prospect.source %></td>
       <td><%= prospect.first_name %></td>
       <td><%= prospect.last_name %></td>
       <td><%= prospect.country %></td>
       <td><%= prospect.city %></td>
       <td><%= prospect.current_role %></td>
       <td><%= prospect.expertise_description %></td>
    </tr>
 <% end %>

我的问题是:我的数据库中的current_role列似乎在此输出中没有返回任何结果,即使我看到它应该返回结果。

我使用上面的确切代码测试了其他列,并将'current_role'替换为其他术语,并且工作正常。在使用current_role进行搜索时,不会产生任何错误 - 根本没有返回任何结果。

以下是我的架构中的数据库列:

  create_table "prospects", force: :cascade do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "country"
    t.string   "city"
    t.string   "current_role"
    t.string   "expertise_description"
    t.datetime "created_at",                         null: false
    t.datetime "updated_at",                         null: false
    t.string   "source"
    t.string   "expertise_tags",        default: [],              array: true

我花了一段时间搜索关于current_role列的任何不寻常的内容,但是在面对事情时看不到任何问题。

任何有关潜在解决方案的想法都会受到欢迎 - 事实上,即使是我可以做的其他事情的解决方案也很有用。

我正在使用Rails 4.2.1和Postgres用于我的数据库。

编辑:

我还没有找到解决这个问题的方法,但是一个功能性的解决方法是创建一个名为current_position的相同数据库列,并用current_position替换对current_role的引用。到目前为止,这是有效的,但当然这不是一个真正的解决方案。

1 个答案:

答案 0 :(得分:0)

许多评论者帮助解决了我的问题,但我总结了下面的答案,以帮助任何遇到类似问题的人。

似乎与current_role字段存在冲突(我相信由Pundit引起),这导致我的Prospect表中的列被忽略。

这是通过在代码中明确说明表来解决的,例如

Prospect.where("prospects.current_role ILIKE ?", keywords)

为避免将来出现此类冲突,我已将列重命名为current_position。