2009-07-30 4 views
6

jeder. Ich habe eine Idee Active zu nutzen, um etwas seltsam wie im folgenden Beispiel zu implementieren:Wie kann sich die Activetrecord-Tabelle von Rails auf sich selbst beziehen?

SystemInfo < ActiveRecord::Base 
    belongs_to :SystemInfo 

end 

Die Idee ist, System A System B enthalten als Kind kann. Also werde ich Anwendung Skelett erzeugen, wie:

script/generate scaffold SystemInfo parent_id:integer name:string 

und dann, wenn ich System A einlegen, wird I des Systems A-ID als System B des parent_id (System A der parent_id wird gleich 'Null' verwenden und wenn ich das verwenden. Befehl wie folgt aus:

sysA = SystemInfo.find_by_id(1) # Get System A 

ich denke, das möglich ist, System A zu bekommen, und es ist Kind, System B. ähnlich:

sysA.childrens # Get System B and other SystemInfo which has parent_id == 1 (System A's ID) 

Könnten Sie Richtlinie vorschlagen, für mich, diese Idee umzusetzen ich? thi Das ist eine ziemlich verbreitete Idee und wir sollten es tun können. ;)

Antwort

15

Sie haben die richtige Idee.

class SystemInfo < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'SystemInfo' 
    has_many :children, :class_name => 'SystemInfo', :foreign_key => 'parent_id' 
end 

s = SystemInfo.find(1) 
s.children 
# => [...] 
s.parent 
# => <SystemInfo> 
+0

Danke, Erik. Ich habe Ihre Lösung versucht, aber wenn ich es in der Konsole erneut test es zeigen etwas wie unten: reload! Nachladen ... => true >> SysInfo.find (: all) SysInfo.find (: all) Argument: Unknown Taste (n): Klasse Ich benutze Rails 2.3.3. Kannst du mir erklären wieso könnte ich nicht wie du? – Teerasej

+0

Ich habe gefunden, was ich verbessern muss. Ich muss ': class_name' anstelle von ': class' verwenden (möglicherweise aus einer neuen Rails-Version). Vielen Dank, Erik! Ich wähle deine Antwort! ;) – Teerasej

+0

Danke, Teerasej. Ich habe die Antwort aktualisiert, um korrekt zu sein. – erik

2

Blick in acts_as_tree. Ich benutzte es für ein Projekt Weg zurück, so bin ich mir nicht sicher, wie viel es seitdem geändert hat, aber ich denke, es tut, was Sie suchen.

Verwandte Themen