通过id查找的Rails子项返回父类对象

时间:2014-03-27 21:04:05

标签: ruby-on-rails inheritance parent-child

我有一个名为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对象吗?

1 个答案:

答案 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/