Chiến lược duy nhất được hỗ trợ đầy đủ để lưu trữ kế thừa trên ActiveRecord là STI. Tuy nhiên, bạn có thể mô phỏng sự thừa kế bảng lớp bê tông theo nguy cơ của riêng bạn. Việc thừa kế bảng lớp bê tông với lớp cha trừu tượng hoạt động tốt, như được chỉ ra bởi sự cảm thông.
NHƯNG ... Nếu điều bạn muốn là làm cho AnotherSection chỉ là một lớp thông thường (sẽ không được lưu giữ tại cơ sở dữ liệu), bạn có thể vô hiệu hóa cột phân biệt đối xử (theo gợi ý của Veraticus). Tuy nhiên, nếu bạn lưu AnotherSection, nó sẽ được lưu giữ trong cùng một bảng với Phần và bạn sẽ không thể phân biệt chúng với nhau. Ngoài ra, nếu bạn sử dụng AnotherSection để tìm một Mục, nó sẽ trả về một AnotherSection, phá vỡ instantiation gốc:
#create a Section and saves it
sect = Section.create()
sect.save()
#retrieve the Section as a AnotherSection, breaking polymorphism...
sect = AnotherSection.find(sect.id)
# another section is more than a section, it is inconsistent.
Nếu AnotherSection không có ý định để được tiếp tục tồn, con đường an toàn nhất nó để ghi đè các hoạt động liên tục, chẳng hạn như save() và tìm():
class AnotherSection < Section
# disable STI, as pointed by Veraticus
self.inheritance_column = :_type_disabled
# disable save and finding
def save(*args)
#exception? do nothing?
end
def find(*args)
#exception? do nothing?
end
def find_by(*args)
#exception? do nothing?
end
# this does not stops here! there is first, last, and even a forty_two finder method! not to mention associations...
end
Tóm lại, bạn có thể làm điều này, nhưng bạn KHÔNG NÊN. Nguy cơ cao. Bạn nên xem xét một tùy chọn khác, chẳng hạn như sử dụng MIXIN thay vì thừa kế.
nếu bạn không có cột 'loại' không làm phiền bạn ... nếu bạn có' loại', thì bạn có thể tắt nó bằng cách làm những gì @Veraticus đã nói .. – shuriu
Thực tế bạn vẫn còn có STI: các cá thể từ cả hai lớp sẽ được lưu trữ trong cùng một bảng, định nghĩa của STI (Thừa kế bảng đơn) là gì. Bạn chỉ không muốn có một cột phân biệt đối xử ("loại"). Tuy nhiên, làm thế nào bạn sẽ biết nếu mỗi bản ghi từ các phần là một phần đồng bằng hoặc một AnotherSection? – atorres