【发布时间】: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