连接查询在控制台中有效,但在视图中无效

时间:2018-06-25 14:31:03

标签: ruby-on-rails activerecord

我问了一个先前的问题,关于如何正确组织搜索查询,但是我发现它仅在控制台中有效。我在这里拥有的内容实际上与在另一种模型上使用的搜索方法相同(另一种不使用联接),但是由于某种原因,该方法不返回任何内容。这个也将%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]]。

确实看起来应该可以,但是不是吗?

1 个答案:

答案 0 :(得分:4)

这里是在OP中看到的一些错误,因此请遵循以下内容。

  

在联接查询中,没有任何问题,问题在于viewcontroller

您不需要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 %>

希望它会起作用。