запрос соединения работает в консоли, но не отображается - PullRequest
0 голосов
/ 25 июня 2018

Я задал предыдущий вопрос о том, как правильно структурировать мой поисковый запрос, но обнаружил, что он работает только в консоли. То, что я имею здесь, практически идентично методу поиска, используемому в другой модели (другая не использует соединения), но по какой-то причине этот метод ничего не возвращает. Этот также выплевывает %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 %>

Я получаю вывод терминала

`ВЫБЕРИТЕ СЧЕТЧИК (*) ИЗ" коллекций "ВНУТРЕННИХ ПРИСОЕДИНЯЙТЕСЬ к "blobs" ON "blobs". "Id" = "collection". "Blob_id" INNER JOIN "items" ON "items". "id" = "blobs". "item_id" ГДЕ "collection". "user_id" = $ 1 AND (items.a ILIKE '% # {search}%') [["user_id", 1]].

Действительно кажется, что это должно работать, но это не так?

1 Ответ

0 голосов
/ 11 июля 2018

Здесь в ОП виден какой-то неправильный результат, поэтому следуйте приведенному ниже.

В запросе на соединение нет проблем, проблема в том, где 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 %>

Надеюсь, это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...