2009-04-28 4 views
0

Versuchen, mit Sphinx/Thinking Sphinx zum ersten Mal auszukommen.Denken Sphinx - RuntimeError: Fehlendes Attribut für Fremdschlüssel

Ich habe meine Modelle definiert bekam wie folgt (vereinfacht):

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 

Immer wenn ich rufen

Branch.first.leads.search 

I

bekommen
RuntimeError: Missing Attribute for Foreign Key branch_id 

Was mache ich falsch?

Antwort

3

Das Problem ist, dass Sphinx branch_id als Attribut in Ihrem Index muss denken, so kann es Ergebnisse zu beschränken, nur den relevanten Zweig (weil Sie in einem Verein sind).

Es ist nicht klar aus Ihren Assoziationen (oder vielleicht nur aus meinem dringenden Bedürfnis nach Schlaf), ob ein Blei über den Besitzer oder direkt auch zu einem Zweig gehört. Wenn der erste, Bens Vorschlag ist wahrscheinlich richtig. Ansonsten versuchen Sie folgendes zu Ihrem define_index Block hinzu:

has branch_id, :as => :direct_branch_id 

Ein alternativer Ansatz, nach dem Lesen der Kommentare, ist Ihre eigene Suchmethode zum führt Verein in der Niederlassung hinzuzufügen. Eine vage Versuch (Sie debuggen benötigen, bin ich sicher):

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 

Das um die Tatsache erhalten sollte, dass Sie keinen direkten Bezug auf die Niederlassung von Blei haben. Das einzige mögliche Problem ist, dass ich nicht sicher bin, ob benutzerdefinierte Erweiterungen vor oder nach dem, was Thinking Sphinx injiziert, geladen werden. Probieren Sie es aus, ob es hilft.

+0

Danke pat. Ja, eine Spur gehört über den Besitzer zu einer Branche und es gibt keine direkte Verbindung dorthin. Das Problem mit Bens Vorschlag ist, dass es so etwas wie gar nicht gibt. :( –

+0

Ähm, ich bin ein bisschen verwirrt, wie das goes_to auf Lead funktioniert dann funktioniert? – pat

+0

Oh! Es tut uns leid, die Verbindung zwischen Leads und Branches von Leads ist nicht in meinem Modell definiert (ich verwechselte gehört gehört_zu: in das Lead-Modell verzweigen, ich war auch ein bisschen schläfrig - es ist jetzt entfernt.) Nun, das Problem ist, dass es keinen Weg gibt (zumindest wie ich sehe), wie man eine Assoziation definiert, die auf einer Seite definiert ist has_many: through (weil es so etwas wie hingeht nicht gibt) Ich habe viele Dinge ausprobiert, wie zum Beispiel Delegation, aber nichts hat funktioniert. Ich glaube, ich mache einen lächerlichen Fehler. Wie auch immer, danke, für deine Bemühungen –

0

Ich glaube, Sie vermissen a: through-Option auf Ihre Filiale Beziehung. Versuchen Sie die Aktualisierung auf:

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

Ich fürchte, dass: ist keine gültige Option für Associates_to Association. SO VIEL ICH WEISS. –

+0

Entschuldigung, ich wollte damit zu einer has_one-Beziehung wechseln. Meine Antwort jetzt aktualisiert! – Ben

+0

Leider funktioniert das nicht, da der Eigentümer einer Zweigstelle gehört und has_one: branch,: through =>: Der Besitzer gibt mir nur eine Ausnahme. –

0

Wenn Sie eine Leitung belongs_to eine Verzweigung sagen, dann müssen Sie eine branch_id in der Leitungstabelle haben. Da du es nicht tust, ist es keine belongs_to Beziehung. Ich denke, du brauchst so etwas:

+0

Danke Sarah, ich habe kein vollständiges Model zur Verfügung gestellt - natürlich habe ich die assigns_to: Branchenverknüpfung in meinem Usermodell schon. Leider hilft das nicht. –

Verwandte Themen