我正在我的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的引用。到目前为止,这是有效的,但当然这不是一个真正的解决方案。
答案 0 :(得分:0)
许多评论者帮助解决了我的问题,但我总结了下面的答案,以帮助任何遇到类似问题的人。
似乎与current_role字段存在冲突(我相信由Pundit引起),这导致我的Prospect表中的列被忽略。
这是通过在代码中明确说明表来解决的,例如
Prospect.where("prospects.current_role ILIKE ?", keywords)
为避免将来出现此类冲突,我已将列重命名为current_position。