我问了一个先前的问题,关于如何正确组织搜索查询,但是我发现它仅在控制台中有效。我在这里拥有的内容实际上与在另一种模型上使用的搜索方法相同(另一种不使用联接),但是由于某种原因,该方法不返回任何内容。这个也将%5B%5D
吐出到url中,而另一个则没有。
模型中的搜索功能:
Class Collection
def self.search(search)
if search
joins(blob: :item).where("items.a ILIKE ?", "%#{search}%")
else
order('id DESC')
end
end
end
我的控制器:
@collections = if params[:search]
current_user.collections.search(params[:search]).order("created_at DESC")
else
current_user.collections.order("created_at DESC")
end
我的观点:
<%= form_tag collections_path, method: 'get' do %>
<%= text_field :search, params[:search] %>
<% end %>
<% @collections.each do |c| %>
<%= c.item.a %>
blah blah
<% end %>
我得到的终端输出是
`从“集合”内部选择COUNT(*) 在“ blobs”上加入“ blobs”。“ id” =“ collections”。“ blob_id”内部加入 “ items” ON“ items”。“ id” =“斑点”。“ item_id” “ collections”。“ user_id” = $ 1 AND(items.a ILIKE'%#{search}%') [[“ user_id”,1]]。
确实看起来应该可以,但是不是吗?
答案 0 :(得分:4)
这里是在OP中看到的一些错误,因此请遵循以下内容。
在联接查询中,没有任何问题,问题在于
view
和controller
您不需要if search
条件,因为您已经将此条件纳入控制器方法
def self.search(search)
joins(blob: :item).where("items.a ILIKE ?", "%#{search}%")
end
查看ILIKE
键仅适用于PostgreSQL,如果您的开发数据库为sqlite3
,则查询将看起来像这样
joins(blob: :item).where("lower(items.a) LIKE (?)", "%#{search.downcase}%")
将其更改为self.search
方法。
并遵循以下代码进入控制器
if params[:search].present?
@collections = current_user.collections.search(params[:search]).order("created_at DESC")
else
@collections = current_user.collections.order("created_at DESC")
end
文本字段会这样改变
<%= text_field_tag :search, value: params[:search] %>
所以表单看起来像这样
<%= form_tag collections_path, method: 'get' do %>
<%= text_field_tag :search, params[:search] %>
<% end %>
希望它会起作用。