2009-07-29 10 views
1

ich mit einem hasMany/belongsTo Verein zwei Active Modelle haben:Active Mit belongs_to mit zwei Schlüsseln

class User < ActiveRecord::Base 
    has_many :letters 
end 

class Letter < ActiveRecord::Base 
    belongs_to :user 
end 

Das User-Modell ein revision_number Attribut hat, auf die ich die belongs_to Verein Umfang haben möchten, so der Brief ist einem Benutzer sowohl von user.id als auch von user.revision_number zugeordnet.

Ich habe versucht, die Verwendung von: Bedingungen Schlüssel wie in der API-Dokumentation dokumentiert:

class Letter < ActiveRecord::Base 
    belongs_to :user, :conditions => "revision_number = #{client_revision}" 
end 

aber versucht, Client-Revision auf dem Briefklasse aufrufen, nicht die Instanz von Brief. Kann mir jemand in die richtige Richtung zeigen, um die assignes_to-Assoziation richtig zu definieren?

Ich verwende das acts-as-revisable Plugin, um das Benutzermodell zu versionieren.

Antwort

0

endlich herausgefunden, was ich brauchte etwas wie zusammengesetzte Schlüssel war, die Rails Activerecord 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 eine Reihe von sowohl abrufen Briefe, aber Letter # 2.client werden Kunde # 1R2, während Letter # 2.client Client-Nummer abruft 1R4 abrufen:

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 die beste Lösung für dieses Problem, aber es scheint arbeite jetzt.

0

Ich habe eine schwere Zeit zu verstehen, warum Sie die belongs_to auf diese Weise zu erfassen möchten. Korrigiere mich, wenn ich falsch liege, 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 
+0

Wenn Sie möchten, können Sie den aktuellen Stand auf die neueste Version von updated_at setzen und eine has_one verwenden. Das würde vermeiden, dem Buchstabenmodell einen weiteren Fremdschlüssel hinzuzufügen. –

+0

Hallo, Danke für Ihre Antworten. Ich benutze das acts_as_revisable Plugin. In meiner Datenbank werden Benutzer versioniert, sodass Änderungen am Benutzermodell überprüfbar sind. Briefe werden nicht versioniert. Der Text eines Briefs enthält gebundene Werte, z. B. den Namen des Benutzers. Wenn der Brief angezeigt wird, sollte er zum Zeitpunkt der Erstellung des Briefs den Namen des Kunden anzeigen. Vielleicht ein besseres Beispiel wären Produkte auf Rechnungen; Der Preis des Produkts muss in der Rechnung erfasst werden, damit beim Anzeigen einer Rechnung mehrere Monate später der korrekte Preis zum Zeitpunkt der Erstellung der Rechnung angezeigt wird. Danke, Chris –

Verwandte Themen