【问题标题】:Ruby on Rails - search function not returning results on one columnRuby on Rails - 搜索功能不会在一列上返回结果
【发布时间】:2015-06-24 15:50:03
【问题描述】:

我正在我的 Rails 应用程序中实现“位置”搜索,它能够搜索除其中一个之外的所有数据库列。我已经研究了很长时间,但无法弄清楚为什么会发生这种情况。

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

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_role 的引用替换为 current_position。到目前为止,这是可行的,尽管它当然不是真正的解决方案。

【问题讨论】:

  • 如果您使用ILIKE 而不是LIKE 使其不区分大小写怎么办?
  • 你在控制台检查过吗?你能试试类似的东西吗:Prospect.where("prospects.current_role ILIKE ?", keywords)
  • 当您查看to_sql 进行查询并在数据库中运行结果时,它是否有效?
  • 您的应用程序中是否有任何 gem 尝试提供授权功能并公开可能会干扰模型的属性名称的 current_role 方法? (或者可能是 Rails 本身,现在无法检查。)
  • 如果这是一个干扰问题,我在第三条评论中发布的代码应该可以修复它。您必须在列之前简单地提及表名。

标签: ruby-on-rails ruby postgresql


【解决方案1】:

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

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

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

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

不过,为了避免将来发生此类冲突,我已将列重命名为 current_position。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2013-12-23
    • 2016-08-16
    • 2012-07-23
    • 2016-01-12
    • 2018-09-04
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多