Мыслящий сфинкс has_many: через отношения - PullRequest
1 голос
/ 05 апреля 2011

У меня есть отношения многие ко многим между бухгалтерской книгой и персоналом, и я хотел бы использовать 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.

Ledger Model

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 )

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

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

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

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

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

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

Я начал играть с Дельтой и ее ассоциациями, как в документации по мышлению-сфинксу. Тем не менее, похоже, не работает.

Вот то, что я поместил в мою модель ГК:

  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'

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011

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

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

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

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}

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

0 голосов
/ 03 марта 2012

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

...