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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top