Ruby on rails Rails子find by id返回父类对象

Ruby on rails Rails子find by id返回父类对象,ruby-on-rails,inheritance,parent-child,Ruby On Rails,Inheritance,Parent Child,我有一个名为Field的父类 class Field < ActiveRecord::Base end 类字段

我有一个名为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
class ProfileField
我有一个数据库表“fields”,其中有一列名为field\u type。 我在Field_type列中使用Field.create和null创建了一个Field对象。 我还使用ProfileField.create创建了一个ProfileField对象,并给出了一个类型为“profile\u field”的示例

假设Field对象(父类)的id为10,子对象ProfileField id为11。 当我执行ProfileField.find(10)时,我将返回一个ProfileField对象。当我执行Profile.find(10)时,我还会得到一个Profile对象。
当我执行ProfileField.find(10)时,我不应该得到任何东西吗?因为id为10的对象是Profile对象而不是ProfileField对象?

从您共享的代码中可以看出,您似乎手动实现了单表继承。然而,Rails(或者更确切地说是Active Record)并不知道您的意图。它只知道两个类使用同一个表。您只需在
字段类型
列中输入“monkey”或任何其他任意值,AR就不会知道它应该实际确定要使用的类

STI的唯一正确指示是名为
type
的表列。这是一个通用的约定—某种保留的列名仅用于此目的

Rails/AR将自己处理类型列。事实上,你可能不应该修补它。无论何时从表中选择一条记录,都将根据实现中预期的类型列获得对象类型

有关STI及其实施和使用的更多信息,请参见此处:


Active record将您的请求/命令转换为sql。因此,如果Field和ProfileField的表相同,那么findbyid应该返回这两个类的结果。也许你应该用一个布尔字段来区分这两个…谢谢。我找到了答案。我需要一个类型列“我的字段”表,它在创建新对象时会自动填充对象类型。相同的逻辑,不同的操作。我的只是一个想法,不是唯一的方法。你把自己的做法写下来是件好事。坚持下去。