Mit Active belongs_to mit zwei Schlüsseln
-
05-07-2019 - |
Frage
Ich habe zwei Active Modelle mit hasMany / belongsTo Verein:
class User < ActiveRecord::Base
has_many :letters
end
class Letter < ActiveRecord::Base
belongs_to :user
end
Das User-Modell hat ein revision_number Attribut, auf die ich den belongs_to Verein Umfang haben möchte, so wird der Buchstabe zugeordnet zu einem Benutzer sowohl user.id und user.revision_number.
Ich habe versucht, mit dem: Bedingungen Schlüssel wie in der API-Dokumentation dokumentiert:
class Letter < ActiveRecord::Base
belongs_to :user, :conditions => "revision_number = #{client_revision}"
end
aber diese Versuche Client-Revision auf dem Briefklasse aufrufen, nicht die Instanz von Brief. Könnte jemand mich in die richtige Richtung weisen die belongs_to Verband richtig für Scoping?
Ich verwende die Akten-as-revidierbar Plugin Version der Nutzer Modell.
Lösung 2
Schließlich herausgefunden, was ich brauchte, war so etwas wie zusammengesetzte Schlüssel, die Active Rails nicht unterstützt. Die Lösung (bis jetzt zumindest) war benutzerdefinierte Client-Zugriffsmethoden auf dem Brief zu schreiben, die zusammengesetzten Schlüssel (id und revision_number) zu unterstützen:
class Letter < ActiveRecord::Base
def client
Client.find_by_id(self.client_id).try(:find_revision, self.client_revision)
end
def client=(c)
self.client_id = c.id
self.client_revision = c.revision_number
end
end
class Client < ActiveRecord::Base
acts_as_revisable
has_many :letters
end
Mit diesem Setup-Client # 1.letters wird ein Array von beiden Buchstaben abzurufen, aber Letter # 2.client wird Kunde # 1R2 abrufen, während Letter # 2.client 1R4 Client-Nummer abruft:
Client id: 1 1 1 1 1 1
rev_number: 1 2 3 4 5 6
Letter id: 1 2
client_id: 1 1
client_revision: 2 5
Immer noch nicht sicher, ob dies der beste Ansatz für dieses Problem ist, aber es scheint jetzt zu arbeiten.
Andere Tipps
Ich habe eine harte Zeit zu verstehen, warum Sie die belongs_to
zu Umfang auf diese Weise wollen. Korrigieren Sie mich, wenn ich falsch bin, aber es könnte besser sein, so etwas zu tun. Ich gehe davon aus Sie irgendeine Art von Versionskontrollsystem soll:
class User < ActiveRecord::Base
has_many :letters
end
class Letter < ActiveRecord::Base
has_many :revisions, :class_name => "LetterVersion"
belongs_to :current, :class_name => "LetterVersion"
end
class LetterVersion < ActiveRecord::Base
belongs_to :letter
end