3 Stimmen

(Rails Frage) Zusammenführen mehrerer polymorpher has_many Beziehungen

(Dies ist nicht der tatsächliche Code, den ich verwende, obwohl dies die Idee dessen zusammenfasst, was ich tun möchte)

Klasseverbindung < ActiveRecord::Base
  gehört zu :verbindung1, :polymorph => true
  gehört zu :verbindung2, :polymorph => true
end

KlasseBenutzer < ActiveRecord::Base
  hat_viele :follower, :class_name => 'Verbindung', :als => :verbindung1
  hat_viele :folgend, :class_name => 'Verbindung', :als => :verbindung2
end

Meine Frage ist, wie ich eine Methode namens "Netzwerk" erstellen kann, so dass das zurückgegebene Element nicht ein Array ist. So:

u = Benutzer.erstens
u.netzwerk # dies wird eine zusammengeführte Version von :folgend und :follower zurückgeben

So dass ich immer noch das hier machen kann:

u.netzwerk.find_by_last_name("James")

ETA:

Oder hmm, ich denke, meine Frage läuft wirklich darauf hinaus, ob es möglich ist, eine Methode zu erstellen, die 2 has_many Verknüpfungen so zusammenführt, dass ich immer noch deren find_by Methoden aufrufen kann.

0voto

jimworm Punkte 2701

Sind Sie sicher, dass Sie eine Sammlung von Verbindungen wollen, anstatt eine Sammlung von Benutzern?

Wenn Sie eine Sammlung von Verbindungen benötigen, scheint es, dass Sie gut bedient werden durch eine Klassenmethode auf Connection (oder scope, wenn Sie solche Dinge mögen).

connection.rb

class Connection < ActiveRecord::Base
  class << self
    def associated_with_model_id(model, model_id)
      include([:connection1, :connection2]).
      where("(connection1_type IS #{model} UND connection1_id IS #{model_id})
            ODER (connection2_type IS #{model} UND connection2_id IS #{model_id})")
    end
  end
end

user.rb

class User < ActiveRecord::Base
  def network
    Connection.associated_with_model_id(self.class.to_s, id)
  end

Vielleicht nicht so nützlich, wie Sie es gerne hätten, aber vielleicht gibt es Ihnen einige Ideen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X