Denken Sphinx - Runtime: Fehlende Attribute für Fremdschlüssel
-
18-09-2019 - |
Frage
Der Versuch, mit Sphinx / Denken Sphinx zum ersten Mal auszukommen.
Ich habe meine Modelle bekam wie folgt definiert (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 anrufen
Branch.first.leads.search
ich
RuntimeError: Missing Attribute for Foreign Key branch_id
Was mache ich falsch?
Lösung
Das Problem ist, dass Denken Sphinx branch_id
als Attribut in Ihrem Index benötigt, so kann es Ergebnisse zu beschränken, nur den relevante Zweig (weil Sie in einem Verein sind).
Es ist nicht klar von Ihren Assoziationen (oder vielleicht, dass mein dringender Bedarf an Schlaf nur), ob eine Führung über den Eigentümer zu einem Zweig gehört, oder auch direkt. Wenn die ehemaligen, ist Ben Vorschlag 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. Ein vageer Versuch (Sie werden zu debuggen müssen, ich bin 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
Dies sollte sich um die Tatsache erhalten, dass Sie keinen direkten Bezug auf die Niederlassung von Blei haben. Das einzig mögliche Problem ist, dass ich nicht sicher bin, ob benutzerdefinierte Erweiterungen, bevor erhalten geladen oder nach dem, was einspritzt Sphinx Denken. Geben Sie ihm einen Schuss, sehen, ob es hilft.
Andere Tipps
Wenn Sie einen Lead belongs_to
einen Zweig sagen, dann müssen Sie eine branch_id
in den Leitungen Tisch. Da Sie das nicht tun, dann ist es keine belongs_to
Beziehung. Ich glaube, Sie so etwas wie dieses brauchen:
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
Ich glaube, du verpasst ein: durch Option auf Ihrem Zweig Beziehung. Versuchen Sie die Aktualisierung auf:
class Lead < ActiveRecord::Base
has_one :branch, :through => :owner