Поиск через .select (). Group (). Возможно? - PullRequest
0 голосов
/ 21 сентября 2019

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

Цель - найти дубликаты для последующего использования в качестве параметра поиска.

Я хочу найти LineItem :store_title, которые соответствуют, чтобы я мог создать выпадающий список для поиска по LineItem, которые соответствуют конкретным :store_title.

Пример: LineItem DB:

line_item.title = "Hello"

line_item.title = "Hello"

line_item.title = "Okay"

line_item.title = "Bar"

Я хочу иметь выпадающий тег select_tag при поиске следующего:

  • [select]

  • "Hello"

  • "Хорошо"
  • "Бар"

И добавьте все результаты, которые соответствуют LineItem.title из выбранных.

Я попробовал несколько способов:

Мне до сих пор удавалось заставить уникальное выпадающее поле выбора работать, но я не уверен, что это правильный путь, потому что он создает массив:

Контроллер:

@vendor_line_items = LineItem.where(vendor_id: @vendor.id).select(:store_title).group(:store_title).distinct

if params[:search]
   @orders = Order.line_item_search(params[:search]).joins(:line_items).where(line_items: {vendor_id: @vendor.id})
end

ORDS Модель:

def self.line_item_search(search)
    scope = joins(:line_items)
    line_items = scope.where(line_items: { id: LineItem.where(store_title: "#{search.downcase}") })
    line_items
end

Просмотр:

<%= form_tag vendor_orders_path, :method => 'get' do %>
  <%= collection_select(:search, params[:search], @vendor_line_items, :store_title, :store_title, {}, {class: "form-control-sm col-5"})%>
  <%= submit_tag "Search", :name => nil, class: "btn btn-primary btn-sm" %>
<% end %>

Ошибка:

Неопределенный метод 'downcase' для ["store_title"]: Array:

Могу ли я изменить свою модель, чтобы разрешить массив, или я должен найти уникальные названия магазинов другим способом?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Я пытался найти способ снять скобки перед поиском, чтобы скобки не присутствовали в параметрах поиска, но не смог выяснить.

Doing ...:

line_items = scope.where(line_items: { id: LineItem.where(store_title: "#{search.join(', ')}") })

Решено.Это снимает скобки перед поиском в БД и работает.

0 голосов
/ 21 сентября 2019

Если вы просто хотите уменьшить число строк в этом массиве, вы можете сделать что-то вроде этого:

line_items = scope.where(line_items: { id: LineItem.where(store_title: search.map(&:downcase)) })

Это предоставит список строк в нижнем регистре для вашего запроса.

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