мышление-сфинкс has_many: через отношения

У меня есть отношения «многие ко многим» между бухгалтерской книгой и персоналом, и я хотел бы использовать Thinking-Sphinx (TS) для поиска в бухгалтерских книгах, которыми владеет член current_staff.

В консоли Rails 3 я пробовал следующее

> Ledger.search 'test', :include => :staff_ids, :with => {:staff_ids => 1}
Returns []
> Ledger.search 'test', :include => :staff_id,  :condition => {:staff_id => 1}
Returns ledgers which do not belong to staff member with id 1.

Модель бухгалтерской книги

class Ledger < ActiveRecord::Base
  has_many :employees
  has_many :staff, :through => :employees

  define_index do
    indexes :name
#    indexes staff.id, :as => :staff_id # many to many relationship.
    has staff(:id), :as => :staff_ids # many to many relationship.    

    set_property :delta => true
  end
end

Модель персонала

class Staff < ActiveRecord::Base
  has_many :employees
  has_many :ledgers, :through => :employees

  define_index do
    indexes username
    indexes surname
    indexes firstname

    set_property :delta => true    # http://freelancing-god.github.com/ts/en/deltas.html    
  end
end

У меня есть следующая настройка перегиба

  inflect.uncountable %w( staff )

Я пробовал индексы и в своей модели Ledger перестраивал и перезапускал TS после каждого изменения индексов.

Обновление 1:

Я очень близко. Если я выполню 'rake ts:reindex', а затем перезапущу сервер rails, мой поиск в реестрах (связанных с current_staff) будет работать нормально:

@results = Ledger.search params[:search], :include =>:staff_id, :conditions =>{:staff_id => current_staff.id}

Это похоже на то, что у меня должна быть дельта в моей модели has_many :through, это правильно?

Обновление 2:

Я начал играть с дельтами и ассоциациями, как в документации Thinking-sphinx. Все еще, кажется, не работает.

Вот что я добавил в свою модель Ledger:

  after_save :set_staff_delta_flag
  ...
  private

  def set_staff_delta_flag
    staff.delta = true
    staff.save
  end

Я получаю следующую ошибку при попытке добавить новую книгу:

NoMethodError (undefined method `delta=' for #<Class:0x00000001516340>):
  app/models/ledger.rb:19:in `set_staff_delta_flag'
  app/controllers/ledgers_controller.rb:24:in `create'

person map7    schedule 05.04.2011    source источник


Ответы (2)


Я нашел ответ!

Я должен установить флаг дельты нотоносца после сохранения, но поскольку у меня их несколько, я должен сделать это для каждого нотоносца.

Вот моя модель бухгалтерской книги

class Ledger < ActiveRecord::Base
  has_many :employees
  has_many :staff, :through => :employees

  after_save :set_staff_delta_flag

  define_index do
    indexes :name
    indexes staff.id, :as => :staff_id # many to many relationship.
    set_property :delta => true
  end

  private

  def set_staff_delta_flag
    staff.map{ |s| s.update_attribute("delta", true)}
  end
end

Теперь в моем приложении Rails, если я добавлю новую книгу для текущего сотрудника и использую следующее, я увижу новую книгу в результатах поиска.

@results = Ledger.search params[:search], :include =>:staff_id, :conditions =>{:staff_id => current_staff.id}

Если есть лучший способ сделать это, дайте мне знать.

person map7    schedule 05.04.2011

Для меня это разрешилось само собой, когда я добавил attr_accessor :delta к моделям, которые я дельта-индексировал.

person Cyrus    schedule 03.03.2012