2 Stimmen

Rails Assoziationen: Zugriff auf fremde Werte durch Nicht-Standardnamen

Ich musste die Rails-Konvention brechen, um eine geschäftliche Notwendigkeit zu erfüllen, und das bereitet mir einige Schmerzen. Meine Absicht ist es, in der Lage sein, eine fremde Tabelle (durch Rails) durch zwei separate Methoden zu verweisen.

Ein typisches Szenario sieht etwa so aus:

class Employee < ActiveRecord::Base
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :employees
end

Sie könnten dann über ein Employee-Objekt auf ein Unternehmen verweisen, indem Sie etwas wie das Folgende tun:

e = Employee.find(1)
puts e.company.name

Das funktioniert für die meisten Tabellen gut, aber sagen wir, wir haben eine Tabelle wie die folgende:

id - integer default_channel_id - integer and foreign key reference to channel table selected_channel_id - integer and foreign key reference to channel table

Wie dargestellt, ist es nicht möglich, einfach die Konvention bestimmen zu lassen, wie die Verbindung hergestellt wird, weil mehr als eine Spalte auf denselben Fremdschlüsselwert verweist.

Ich habe die Lektüre der Rails-Dokumentation über Assoziationen aber ich habe nichts gefunden, was es mir erlaubt, Assoziationen auf diese Weise zu definieren. Am nächsten kam ich mit der Option :foreign_key, aber das allein hat nicht funktioniert, weil es eine einzige Methode mit dem Namen channel erzeugt hat. Hier ist mein Versuch:

class Foo < ActiveRecord::Base
  belongs_to :channel, :foreign_key => "default_channel_id"
  belongs_to :channel, :foreign_key => "selected_channel_id"
end

Wie sollte ich dabei vorgehen?

Nota: Nur für den Fall, dass es hilft, ich bin mit Ruby 1.9.2 und Rails 3.0.3 arbeiten.

3voto

Ryan Bigg Punkte 104835

Definieren Sie die Assoziationen wie folgt:

belongs_to :default_channel, :class_name => "Channel"
belongs_to :selected_channel, :class_name => "Channel"

Dies verweist auf die default_channel_id Feld in Ihrer Datenbank, um die default_channel und ich wette, dass Sie mit diesen Informationen herausfinden können, was passiert, wenn Sie anrufen selected_channel .

1voto

micred Punkte 1458
class Foo < ActiveRecord::Base
  belongs_to :default_channel, :class_name => "Channel"
  belongs_to :selected_channel, :class_name => "Channel"
end

y

class Channel < ActiveRecord::Base
  has_many :default_channels, :foreign_key => 'default_channel_id'
  has_many :selected_channels, :foreign_key => 'selected_channel_id'
end

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