6

nói, nếu chúng ta tạo ra một mô hìnhTrong Ruby on Rails, nếu chúng ta tạo ra một mô hình "Animal", và bây giờ muốn có "Dog", chúng ta nên làm như thế nào?

rails generate model animal name:string birthday:date 

và bây giờ chúng tôi muốn tạo ra mô hình khác để kế thừa từ nó (chẳng hạn như Chó và Mèo), chúng ta nên sử dụng rails generate model lại hoặc chỉ cần thêm các tập tin mình? Làm cách nào để chúng tôi chỉ định Chó nên được kế thừa từ Động vật nếu chúng tôi sử dụng rails generate model?

Tôi nghĩ nếu chúng tôi sử dụng rails generate model thay vì tự thêm các tệp mô hình, sẽ có các tệp thử nghiệm đơn vị và tệp lịch thi đấu được tạo cho chúng tôi. Tệp di chuyển cũng được thêm vào, ngoại trừ nếu nó đang sử dụng MongoDB, thì sẽ không có tệp di chuyển.

Trả lời

2

Theo như tôi biết, bạn không thể chỉ định siêu lớp khi tạo mô hình. Tuy nhiên, máy phát điện chỉ là một bước đệm để tạo ra các lớp học của bạn. Bạn có thể tạo lớp mô hình như bình thường và chỉ cần thay đổi lớp cha trong tệp mô hình được tạo ra. Không có nơi nào khác mà mối quan hệ thừa kế phải được xác định cho các tệp được tạo ra để làm việc (các đồ đạc và các bài kiểm tra đơn vị ví dụ không chỉ định các siêu lớp hoặc các lớp con).

Vì vậy:

script/generate model Dog 

Sau đó thay đổi:

class Dog < ActiveRecord::Base 

tới:

class Dog < Animal 

Nếu bạn muốn tạo ra một mô hình mà sẽ thừa hưởng từ động vật sử dụng thừa kế bảng duy nhất sau đó bạn có thể muốn chỉ định --skip-migrations trên kịch bản lệnh/tạo cuộc gọi (mặc dù bạn có thể muốn di chuyển để thêm ví dụ cột cụ thể cho chó vào bảng loài vật và bạn sẽ cần thêm cột type của chuỗi loại vào bảng loài vật).

+2

này cần một String cột na med 'type' hiện diện trong' Động vật'. – Swanand

+0

Cuộc gọi tốt, được cập nhật. – Shadwell

7

Nếu Dog, Cat và lớp con khác mà bạn đang có kế hoạch sẽ không phân ra khỏi Animal mô hình, bạn có thể STI (Single Table Inheritance) mẫu ở đây.

Để làm điều đó, hãy thêm một cột String vào Animal. Và sau đó bạn có thể có:

class Dog < Animal 
end 

class Cat < Animal 
end 

>> scooby = Dog.create(:name => 'Scooby', :date => scoobys_birthdate) 
=> #<Dog id: 42, date: "YYYY-MM-DD", type: "Dog"> 

Để tạo mô hình Dog

$ script/generate model Dog --skip-migration 

và sau đó thay đổi (thường là app/models/dog.rb):

class Dog < ActiveRecord::Base 

để

class Dog < Animal 
+0

tôi hiểu ... làm thế nào nếu có thêm thuộc tính với lớp này, chẳng hạn như 'fur_color: string'? nó ảnh hưởng như thế nào đến 'tạo' và các bảng? –

+0

Nếu bạn thêm cột mới, giả sử 'fur_color' như bạn nói, cột đó sẽ có sẵn cho tất cả các lớp con. Nó có thể không có ý nghĩa luôn, ví dụ. bạn có 'lớp rắn <động vật ', bây giờ rắn không có lông thú. Nhưng cột vẫn sẽ tồn tại. Nhưng nếu bạn chỉ có động vật bị mờ trong hệ thống của bạn thì nó có ý nghĩa hoàn hảo. Đây là những gì tôi có nghĩa là bằng cách phân biệt từ mô hình 'Động vật' ban đầu. Hy vọng rằng sẽ giúp. – Swanand

+4

Bạn có thể xác định siêu lớp khi tạo mô hình bằng cách chỉ định cờ '- minh'. Xem bài viết [this] (http://stackoverflow.com/a/14569424). Nó sẽ không tạo ra bất kỳ di chuyển nào, từ những gì tôi đã quan sát. –