思考 - 狮身人面像has_many:通过关系

时间:2011-04-05 02:11:44

标签: ruby-on-rails thinking-sphinx has-many-through

我在分类帐和员工之间建立了多对多的关系,并希望使用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 )

我已经尝试了索引,并且在我的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上有一个delta:通过模型,这是正确的吗?

更新2:

我开始在思维 - 狮身人面像文档中使用Delta和协会。但似乎仍然没有工作。

以下是我在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'

2 个答案:

答案 0 :(得分:2)

我找到了答案!

我必须在保存后设置员工delta标志,但由于我有多个,我必须为每个员工这样做。

这是我的分类帐模型

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}

如果有更好的方法,请告诉我。

答案 1 :(得分:0)

当我将attr_accessor :delta添加到我是delta索引的模型时,它为我解决了。