2015-03-02 4 views
1

У меня есть 2 модели со следующими полями для запроса.Ассоциации запросов и желаний

  • Customer

    • :first_name
    • :last_name
    • :address
    • :email
  • Relatives

    • :first_name
    • :last_name
    • :address
    • :title

Customer имеет много Relatives.

Я пытаюсь написать search() метод, который возвращает коллекцию Customer записей, где либо поля в Customer или 1+ его Связанно Relatives соответствует запросу.

Цель состоит в том, чтобы иметь возможность производить итерацию коллекции Customer записей. Если customer.relatives.present?, я буду знать, что нужно прокрутить связанные модели Relative, снабженные Customer, - что модели в этой коллекции соответствуют запросу.

настоящее время у меня что-то вроде этого:

class Customer < ActiveRecord::Base 

    has_many :relatives 

    def self.search(params={}) 
    cols = %i(address caseworker last_name) 
    conds = [] 

    cols.reject! { |col| params[col].blank? } 

    conds << cols.collect { |col| "clients.#{col} like ?" }.join(" or ") 
    cols.each { |col| conds << "%#{params[col]}%" } 

    query = self.send(:where, conds) 

    # @todo query relatives here!  
    end 

end 

Где я застревать:

  • Я не могу понять, AREL присоединиться к/слияния/союз/(я не знаю, этот термин Я ищу) модели Customer, которые не соответствуют запросу, но do имеют Relative, соответствующие запросу.
    • Я считаю, что нужно почти идентичны search() на Relative модели - которую я считаю, что могу писать - но я опять не знаете, как заполнить @todo выше для нетерпеливого нагрузки только те Relative, которые соответствуют запросу.

Я ищу любой удар в правильном направлении.

ответ

2

В зависимости от вашей базы данных, вы можете посмотреть что-то вроде pg_search для полнотекстового поиска.

После того, как индексы поиска построены, загрузка с нетерпением. Родственники, соответствующие запросу клиента, тривиальны.

class Customer < ActiveRecord::Base 
    include PgSearch 
    has_many :relatives 

    pg_search_scope :search, 
    :against => [:address, :caseworker, :last_name] 
    :associated_against => { 
    :relatives => [:address, :caseworker, :last_name] 
    } 
end 

Customer.search("foobar").preload(:relatives) 
+0

Это действительно интересно. Вы знаете о эквиваленте MySQL? – rubyhelpme

+0

Кроме того, 'preload (: relativates)' будет загружать ** всех ** родственников, когда меня интересуют только те, которые специально вызвали «Заказчик» для включения в исходный набор. – rubyhelpme

+0

У меня нет опыта работы с полнотекстовым поиском в MySQL, но Thinking Sphinx (http://pat.github.io/thinking-sphinx/) выглядит многообещающим – messanjah

0

Этого камень является простой реализацией поиска и полнотекстового поиска для баз данных MySQL https://github.com/makandra/dusen

Вы, возможно, придешься сделать немного кодирования, чтобы сделать драгоценный камень работает должным образом, например, как определить текст_для_поиск и т.д. Но этот драгоценный камень позаботится обо всем остальном.