0

初めてスフィンクス/シンキングスフィンクスと仲良くしようとしています。

モデルを次のように定義しました(簡略化):

class Branch < ActiveRecord::Base
  has_many  :salesmen, :class_name => "User"
  has_many :leads, :through => :salesmen
end

class User < ActiveRecord::Base
  belongs_to :branch
  has_many :leads, :foreign_key => "owner_id"
end

class Lead < ActiveRecord::Base
  belongs_to :owner, :class_name => "User"

  define_index do
    indexes company_name    
    indexes :name, :sortable => true
    has owner.branch_id, :as => :branch_id
    indexes [owner.last_name, owner.first_name], :as => :owner_full_name, :sortable => true 
  end

end

電話するときはいつでも

Branch.first.leads.search

私は得る

RuntimeError: Missing Attribute for Foreign Key branch_id

私は何が間違っているのですか?

4

3 に答える 3

3

問題は、Thinking Sphinxがbranch_idインデックスの属性として必要であるため、結果を関連するブランチのみに制限できることです(関連付け内で検索しているため)。

リードが所有者を介してブランチに属しているのか、それとも直接に属しているのかは、あなたの協会からは明らかではありません(または、私の切実な睡眠の必要性だけかもしれません)。前者の場合、ベンの提案はおそらく正しいでしょう。define_indexそれ以外の場合は、ブロックに次を追加してみてください。

has branch_id, :as => :direct_branch_id

コメントを読んだ後の別のアプローチは、Branchのリードアソシエーションに独自の検索方法を追加することです。漠然とした試み(デバッグする必要があると思います):

has_many :leads, :through => :salesmen do
  def search(*args)
    options = args.extract_options!
    options[:with] ||= {}
    options[:with][:branch_id] = proxy_owner.id
    args << options
    Lead.search(*args)
  end
end

これは、Leadからのブランチへの直接参照がないという事実を回避する必要があります。考えられる唯一の問題は、ThinkingSphinxが注入するものの前または後にカスタム拡張がロードされるかどうかわからないことです。それを試してみて、それが役立つかどうかを確認してください。

于 2009-04-28T20:25:22.937 に答える
0

ブランチリレーションに:throughオプションがないようです。次のように更新してみてください。

class Lead < ActiveRecord::Base
  has_one :branch, :through => :owner
于 2009-04-28T18:48:07.557 に答える
0

belongs_toLead a Branchと言う場合はbranch_id、Leadsテーブルにを含める必要があります。あなたがしないので、それはbelongs_to関係ではありません。私はあなたがこのようなものが必要だと思います:

class Branch < ActiveRecord::Base
  has_many :leads, :through => :salesmen
  has_many :salesmen, :class_name => "User" 
end

class User < ActiveRecord::Base
  belongs_to :branch # users table has branch_id
  has_many :leads, :foreign_key => "owner_id"
end

class Lead < ActiveRecord::Base
  belongs_to :owner, :class_name => "User" # leads table has owner_id

  define_index do
    indexes :company_name    
    indexes :name, :sortable => true
    has owner.branch_id, :as => :branch_id
    indexes [owner.last_name, owner.first_name], :as => :owner_full_name, :sortable => true 
  end

end
于 2009-04-28T23:58:59.680 に答える