Шины / Elasticsearch для моделей, связанных с HABTM - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь реализовать полнотекстовый поиск с помощью шины / эластичного поиска для моей модели клиента.У меня есть набор пользователей, работающих с клиентами.Существует связь HABTM между моделями клиентов и пользователей.

Существует функция manager для охвата только клиентов, управляемых конкретным пользователем (в большинстве случаев это пользователь, вошедший в систему).Я хотел бы реализовать фильтр поиска в шинах, который будет работать так же, как он работает с ActiveRecord.Это не работает с шиной (выдает ошибку no filter registered for [user_ids]).

s.filter :user_ids, manager(params[:manager]).map(&:id) 
  if params[:manager].present?

Я полагаю, что я мог бы делать что-то совершенно вне стены, но что не так с тем, как я это делаю и какой учебник/ чтение вы бы порекомендовали?

Вот модель.

class Client < ActiveRecord::Base

  has_and_belongs_to_many :users, :uniq => true

  ## Tire would-be implementation
  # include Tire::Model::Search
  # include Tire::Model::Callbacks
  # mapping do
  #   indexes :name
  #   indexes :comment
  #   indexes :user_ids
  # end

  def self.manager(user_id)
    joins(:users).merge(User.current(user_id))
  end

  def self.index_search(params={})
    ## Tire would-be-implementation - does not work
    # tire.search(load: true) do |s|
    #   s.query { string params[:search], default_operator: "AND" } if params[:search].present?
    #   s.filter :user_ids, manager(params[:manager]).map(&:id) if params[:manager].present?
    # end

    # ActiveRecord implementation - works
    if params[:manager].present?
      if params[:search].present?
        @clients = manager(params[:manager]).where(['name LIKE ?', "%#{params[:search]}%"])
      else 
        @clients = manager(params[:manager])
      end
    else
      if params[:search].present?
        @clients = where(['name LIKE ?', "%#{params[:search]}%"])
      else 
        @clients = all
      end
    end
  end

end

1 Ответ

0 голосов
/ 29 июня 2012

Попробуйте что-то вроде

t.filter :not , {:ids => { :values => self.manager(params[:manager]).map(&:id) }} if params[:manager].present?

или

t.filter :ids, :values => self.manager(params[:manager]).map(&:id) if params[:manager].present?
...