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