我有一个名为Field
的父类class Field < ActiveRecord::Base
end
一个名为ProfileField的子类
class ProfileField < Field
def self.base_class ; self ; end
def self.use_base_class; ProfileField; end
self.table_name = "fields"
def field_type
return "profile_field"
end
end
我有一个数据库表“fields”,还有一个名为field_type的列。 我在field_type列中使用带有null的Field.create创建了一个Field对象。 我还使用ProfileField.create创建了一个ProfileField对象,并给出了一个“profile_field”类型。
假设Field对象(父类)的id为10,子Object ProfileFiled id为11。 当我执行ProfileField.find(10)时,我将返回一个ProfileField对象。当我做Profile.find(10)时,我也会得到一个Profile Object。 当我执行ProfileField.find(10)时,我不应该得到任何东西,因为id为10的Object是Profile对象而不是ProfileField对象吗?
答案 0 :(得分:0)
就我所分享的代码而言,您似乎可以手动实现单表继承。但是,Rails(或者说Active Record)并不知道你的意图。它只知道两个类使用同一个表。你可以简单地把&#34; monkey&#34;或field_type
列中的任何其他任意值,AR并不知道它应该实际确定要使用的类。
STI的唯一正确指示是名为type
的表列。这是一般惯例 - 仅为此目的而保留列名。
然后Rails / AR将自己处理类型列。事实上,你可能不应该修补它。每当您从表中选择一条记录时,您将根据您的实现预期的类型列获取对象类型。
有关STI及其实施和使用的更多信息,请参见此处:
http://eewang.github.io/blog/2013/03/12/how-and-when-to-use-single-table-inheritance-in-rails/