2016-09-29 4 views
0

У меня есть база данных с Lab-моделями. Я хочу, чтобы их можно было искать с помощью нескольких разных методов.Rails расширенный поисковый запрос

  1. Я решил использовать одно поле ввода и отдельный запрос в слове массив:

    search = search.split(/[^[[:word:]]]+/).map{|val| val.downcase} 
    
  2. я использую Деяния-как-taggable драгоценного камня, поэтому было бы неплохо включить эти тег в поисках к:

    tag_results = self.tagged_with(search, any: true, wild: true) 
    
  3. для методов вниз ниже его, казалось, необходимо использовать:

    search = search.map{|val| "%#{val}%"} 
    
  4. Веснушка, казалось, также отличный способ пойти для полнотекстового поиска так

    full_text_search = self.search {fulltext search} 
    full_text_results = full_text_search.results 
    
  5. я решил пойти также с поиском простой запрос к базе данных для лаборатории имени:

    name_results = self.where("LOWER(name) ILIKE ANY (array[?])", search) 
    
  6. Наконец, мне нужны все результаты в одном массиве так:

    result = (tag_results + name_results + full_text_results).uniq 
    

Он отлично работает (я имею в виду, что результат - это то, что я ожидаю), но он возвращает простой массив, а не ActiveRecord::Relation, поэтому нет возможности использовать метод, например .select() или .order().

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

Если нет - есть ли способ преобразования массива в ActiveRecord :: Relation? (SO говорит, что нет никакого способа)

+0

Вы также можете просто использовать 'select' и' sort' или 'sort_by' Enumerable в массиве результатов – DiegoSalazar

+0

@ diego.greyrobot, который медленный, как черт :) OP полностью прав, желая преобразовать его в AR –

+0

Что именно является «tag_result» или другим результатом? –

ответ

2

Ответ этот:

есть способ, чтобы преобразовать массив в ActiveRecord :: Relation? (SO говорит, что нет никакого способа)

Вы можете конвертировать акушер массива ActiveRecord объектов в ActiveRecord :: Relation, запрашивая идентификаторы из массива и запрашивая модель AR для объектов с этими идентификаторами:

Model.where(id: result.map(&:ids)) # returns AR, as expected. 

Это единственный способ, о котором я знаю.

+0

Это правильно. Ответ был в SO-потоке, я проверил только одну прокрутку мыши ниже :) Спасибо, что вызвали это. Можете ли вы прокомментировать способ, которым я пользуюсь для поиска? Есть ли какие-либо драгоценные камни, о которых я должен знать, это может помочь мне упростить это? – Ancinek

+0

@ Ancinek Я вижу, что вы солнечное пятно, которое я никогда не использовал (я использовал только elasticsearch), поэтому не могу предоставить никаких ценных данных. Я могу сказать, что это как-то, если можно. Пока он ресурсоэффективен и не медленный - это просто отлично .. –

Смежные вопросы