5

Trong cơ sở dữ liệu của tôi, tôi có một bảng people, và tôi đang sử dụng thừa kế bảng duy nhất, với các lớp:Rails STI và đa cấp thừa kế truy vấn

class Person < ActiveRecord::Base 
end 

class Member < Person 
end 

class Business < Member 
end 

Demonstration of the problem

Các truy vấn nó tạo ra nhầm lẫn tôi. Những gì tôi muốn là cho Member.all để trả lại tất cả các doanh nghiệp cũng như bất kỳ loại phụ khác của thành viên. Nó có tác dụng gì, nhưng chỉ khi tôi đã truy cập vào lớp Doanh nghiệp gần đây. Tôi cho rằng đó là vì các lớp của tôi không được lưu trữ trong chế độ phát triển (vì lý do rõ ràng), nhưng nó vẫn có vẻ như là hành vi lạ lùng/lỗi.

Đây có phải là lỗi trong đường ray không? Hay nó hoạt động như dự định? Trong cả hai trường hợp, bất cứ ai có thể nghĩ về một sửa chữa tốt cho các mục đích phát triển?

+0

vui lòng chỉ định loại thừa kế trong mỗi lớp. –

+0

Ý bạn là gì, huan son? – Obversity

Trả lời

1

Đây là cố ý vi-hướng dẫn Rails chính thức về Autoloading and Reloading Constants giải thích nó khá tốt trong phần trên Autoloading and STI:

Một cách để đảm bảo công trình này hoạt động ctly không phụ thuộc vào thứ tự của thực hiện là để tải các lá của cây bằng tay ở dưới cùng của tập tin định nghĩa các lớp gốc:

# app/models/polygon.rb 
class Polygon < ApplicationRecord 
end 
require_dependency 'square' 

Chỉ có lá mà ít nhất cháu cần phải được nạp cách này . Các lớp con trực tiếp không cần phải được tải trước. Nếu hệ thống phân cấp là sâu hơn, các lớp trung gian sẽ được tự động tải đệ quy từ dưới cùng bởi vì hằng số của chúng sẽ xuất hiện trong định nghĩa lớp làm lớp cha.

Vì vậy, trong trường hợp của bạn, điều này có nghĩa là đặt require_dependency "business" vào cuối lớp Person của bạn.

Tuy nhiên, hãy cẩn thận của phụ thuộc vòng tròn mà có thể có thể tránh được bằng cách sử dụng require thay vì require_dependency (mặc dù nó có thể cấm Rails từ theo dõi và tải lại tập tin của bạn khi thay đổi được thực hiện, sau khi tất cả, require_dependency là một phương pháp Rails-nội) .

+0

Đó là một giải pháp thú vị. Tôi sẽ thử lần tiếp theo này! – Obversity

3

Theo mặc định, Rails không muốn tải các lớp của bạn đang phát triển. Hãy thử thay đổi dòng sau trong config/environments/development.rb của bạn:

# Do not eager load code on boot. 
config.eager_load = false 

tới:

# Do eager load code on boot! 
config.eager_load = true 
+0

Rất hay! Nó dường như đã làm việc trong các ứng dụng giả tôi đã thực hiện để nhân rộng vấn đề, nhưng đã không sửa chữa tất cả các vấn đề của tôi trong ứng dụng thực sự của tôi (có thể được gây ra bởi những thứ khác). Tôi sẽ đánh dấu là được chấp nhận sau này khi tôi có thời gian để kiểm tra đúng cách. Cảm ơn! – Obversity