2009-07-30 18 views
6

mọi người. Tôi có ý tưởng sử dụng Activerecord để thực hiện điều gì đó kỳ lạ như ví dụ bên dưới:Bảng Activerecord của Rails có thể tự giới thiệu như thế nào?

SystemInfo < ActiveRecord::Base 
    belongs_to :SystemInfo 

end 

Ý tưởng là, Hệ thống A có thể chứa Hệ B như con của nó. Vì vậy, tôi sẽ tạo ra bộ xương của ứng dụng như:

script/generate scaffold SystemInfo parent_id:integer name:string 

và sau đó, khi tôi chèn Hệ thống A, tôi sẽ sử dụng hệ thống Một ID như PARENT_ID Hệ thống B (Hệ thống của một PARENT_ID sẽ tương đương với 'nil' và khi tôi sử dụng. lệnh như thế này:

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

tôi nghĩ rằng đây có thể để có được hệ thống A, và đó là trẻ em, Hệ thống B. Tương tự như:

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

thể bạn đề nghị hướng dẫn cho tôi để thực hiện ý tưởng này tôi? thi nk đây là ý tưởng khá phổ biến và chúng ta có thể làm điều đó. ;)

Trả lời

15

Bạn có ý tưởng đúng.

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

Cảm ơn bạn, Erik. Tôi đã thử giải pháp của bạn nhưng khi tôi thử lại nó trong giao diện điều khiển nó hiển thị một cái gì đó như dưới đây: tải lại! tải lại ... => true >> SysInfo.find (: tất cả) SysInfo.find (: tất cả) ArgumentError: Unknown chìa khóa (s): lớp tôi sử dụng Rails 2.3.3. Bạn có thể giải thích cho tôi tại sao tôi không thể làm như bạn? – Teerasej

+0

Tôi đã tìm thấy những gì tôi phải cải thiện. Tôi cần phải sử dụng ': class_name' thay vì ': class' (có thể là, nó là từ phiên bản Rails mới). Cảm ơn bạn rất nhiều, Erik! Tôi chọn câu trả lời của bạn! ;) – Teerasej

+0

Cảm ơn, Teerasej. Tôi đã cập nhật câu trả lời là chính xác. – erik

2

Nhìn vào acts_as_tree. Tôi sử dụng nó trên một dự án cách trở lại, vì vậy tôi không chắc chắn nó đã thay đổi kể từ đó, nhưng tôi nghĩ rằng nó làm những gì bạn đang tìm kiếm.

Các vấn đề liên quan