2010-08-17 46 views
13

Tôi hiện đang làm việc trên ứng dụng Rails 3 có vẻ như nó có thể cần sử dụng Thừa kế bảng lớp cho một vài mô hình.Thừa kế bảng lớp trong Rails 3

Ví dụ đơn giản về những gì đang xảy ra là điều này.

Tôi có một lớp được gọi là Người có các thuộc tính chung như tên, email, mật khẩu chung cho tất cả các loại người trong ứng dụng và được sử dụng để xác thực.

Có hai lớp con cho Người (hoặc hai loại người ...), Người lái xe và Hành khách. Cả hai lớp con này đều chia sẻ các thuộc tính chung của Person nhưng sau đó có các thuộc tính bổ sung cụ thể duy nhất cho chính chúng. (ví dụ: Người lái xe có thể có nhiều Phương tiện và Giấy phép nhưng Hành khách sẽ không)

Tôi sẽ triển khai CTI như thế nào cho tình huống này? Tôi đã nhìn vào một ví dụ được cung cấp ở đây:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

Nhưng nó không suy đoán về cách truy cập các thuộc tính chung của một người từ một điều khiển hoặc hành khách đối tượng và tôi là một chút bối rối bởi cái đó.

Đặc biệt, những gì tôi muốn biết là:

Nếu tôi cập nhật các thuộc tính của một Driver, làm thế nào tôi có thể dễ dàng truy cập và cập nhật các thuộc tính có liên quan trên bảng người mẹ? Tôi có phải móc vào một cuộc gọi lại after_save và tách ra mà cập nhật thuộc tính đi đâu? Hoặc là có cách nào tốt hơn để tiếp cận điều này?

+0

Tôi nên thêm rằng đây là một ví dụ đơn giản về những gì đang diễn ra trong ứng dụng của tôi. Tôi chắc chắn rằng tôi cần phải thực hiện thừa kế bảng lớp trong tình huống của tôi, Thừa kế bảng đơn sẽ không phải là cách tốt nhất. –

+0

Tôi đặt một bình luận trên blog tôi đã đề cập đến trong câu hỏi của mình và tác giả vui lòng cung cấp một ví dụ về một cách để làm điều này: http://rhnh.net/2010/08/17/updating-class-table-inheritance- bảng (Bạn đá Xavier!) –

Trả lời

5

tại sao không sử dụng Thừa kế bảng đơn? ví dụ:

class Person < ActiveRecord::Base 
    # some common code here 
end 

class Driver < Person 
    # Driver code 
end 

class Passenger < Person 
    # Passenger code 
end 

theo cách này bạn sẽ có một lớp người thông thường, cộng với hai lớp học cụ thể có nguồn gốc từ nó

+13

Lưu ý: OP hỏi về cách sử dụng Thừa kế Bảng Lớp, không phải là Thừa kế Bảng Đơn. –

+21

đôi khi mọi người hỏi câu hỏi không chính xác, tôi vừa trả lời một giải pháp có thể cho vấn đề của anh ta. –

+9

Sau đó, nó sẽ được đề xuất như một bình luận. – EdMelo

4

Tôi đang sử dụng thừa kế Plugin bảng lớp và nó hoạt động tốt, http://github.com/brunofrank/class-table-inheritance

+0

Cảm ơn lời khuyên, tôi sẽ kiểm tra các plugin! –

+4

Không phải là giải pháp tốt nhất, gây ra không làm việc tốt với postgres (tức là, không sử dụng này nếu bạn định sử dụng heroku với postgres) – standup75

2

Gần đây tôi đã chia đôi một dự án đầy hứa hẹn để triển khai nhiều thừa kế bảng và kế thừa lớp trong Rails. Tôi đã dành một vài ngày để nó phát triển nhanh chóng, sửa chữa, bình luận và tài liệu và đã phát hành lại nó như là CITIER (Class Inheritance và Table Inheritance Embeddings for Rails).

Tôi nghĩ bạn có khả năng kết hợp nó với các câu trả lời ở trên?

xem xét cho nó một cái nhìn: http://peterhamilton.github.com/citier

Tôi nhìn các giải pháp như repo đẳng cấp bảng thừa kế, nhưng điều này là rất sạch và hợp lý hơn IMO.

Nó cũng hỗ trợ các ngôn ngữ SQL chính SQLite, MySQL, PostgreSQL và có lẽ nhiều hơn nhưng tôi đã không kiểm tra chúng.

+0

đá quý này có vẻ là tính năng nhất hoàn thành trong ba. Tôi có thể hỏi nếu bạn đã xem xét so sánh hiệu suất không? Và cũng tích hợp với Sunspot (kể từ khi xem db được sử dụng)? – lulalala

+0

Hoạt động tuyệt vời ... nhưng chúng tôi gặp rất nhiều vấn đề với heroku. Nó không thích các khung nhìn bảng, đặc biệt là khi đẩy/kéo db. Đã kết thúc việc xóa nó. – Ricky

7

Cũng có một plugin 'acts_as_relation' để làm điều này,
https://github.com/hzamani/acts_as_relation/

trong trường hợp của bạn mã sẽ là thế này:

class Driver < ActiveRecord::Base 
    acts_as :person 
end 

class Passenger < ActiveRecord::Base 
    acts_as :person 
end 

Đừng quên để thêm person_typeperson_id cột để persons bảng.
Bây giờ cả Drive và Passenger đều kế thừa các thuộc tính, xác thực và phương pháp của Người.

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