2009-04-28 29 views
0

Sphinx/Thinking Sphinxとは初めての試みです。Thinking Sphinx - RuntimeError:外部キーの属性がありません

私は次のように私のモデルは(簡体字)に定義持っている:

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 

はいつでも私は

RuntimeError: Missing Attribute for Foreign Key branch_id 

は私が間違って何をやってもらう

Branch.first.leads.search 

を呼びますか?

答えて

3

:にアップデートしてみてください。

鉛が所有者経由で支店に属しているかどうかは、あなたの団体からはっきりしていません。前者なら、Benの提案はおそらく正しいでしょう。そうでない場合は、お使いのdefine_indexブロックに以下を追加してみてください:

has branch_id, :as => :direct_branch_id 

別のアプローチを、コメントを読んだ後、支店でのリード協会に独自の検索メソッドを追加することです。漠然とした試み(デバッグする必要がありますが、私は確信している):

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 

これはあなたがリードから枝への直接参照を持っていないという事実を回避する必要があります。唯一可能な問題は、思考型スフィンクスが注入する前後にカスタム拡張機能が読み込まれるかどうかわからないことです。それが役立つかどうか確認してください。

+0

ありがとうございます。はい、鉛は所有者経由で支店に所属しており、そこには直接の関連はありません。 Benの提案の問題は、belongs_to:throughというようなことはないということです。 : –

+0

Erm、私はちょっと混乱していますが、鉛の場合はbelongs_to呼び出しがうまくいくのですか? – pat

+0

ああ、申し訳ありませんが、リードと鉛の関係は私のモデルでは定義されていません私は少し眠くなっていました - それは今取り除かれています)今、問題は、(少なくとも私が見ることができる)片側にある関連を定義する方法がないことですhas_many:through(belongs_to:throughのようなものはないからです)私は委任など多くのことを試しましたが、何もうまくいかなかったのですが、何かばかげた間違いをしていると思います。 。 –

0

あなたのブランチの関係にa:throughオプションがないと思います。問題は、スフィンクスを考えることは、あなたのインデックスの属性としてbranch_idを必要とするので、(あなたが協会内検索しているので)それだけで、関連するブランチに結果を制限できることです

class Lead < ActiveRecord::Base 
    has_one :branch, :through => :owner 
+0

私は恐れている:スルーはbelongs_toの関連付けのための有効なオプションではありません。私の知る限り。 –

+0

申し訳ありませんが、私はhas_one関係に変更することを意味しました。私の答えは今更新されました! – Ben

+0

残念ながら、所有者がブランチに属し、has_one:branch、:through =>:所有者が例外を除いて何も与えないので、これはうまくいきません。 –

0

リードbelongs_toと言う場合は、リードテーブルにbranch_idが必要です。あなたはしていないので、それは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 
+0

ありがとうSarah、私は完全なモデルを提供しませんでした - 私はもちろん、私のユーザモデルにbelongs_to:ブランチ関連を持っています。残念ながら、それは役に立たない。 –

関連する問題