Rails单表继承-从超类查询调用子类方法



Exam是SatTest和ActTest的父级,与类似

class Exam < ActiveRecord::Base
self.inheritance_column = :test_type
def self.find_sti_class(type_name)
type_name = self.name
super
end
end
class ActTest < Exam
def self.sti_name
'ACT'
end
def some_method
end
end
class SatTest < Exam
def self.sti_name
'SAT'
end
def some_method
end
end

当我查询Exam.find(1)时,它返回Exam的一个实例。因此,当我对此对象调用some_method时,它调用返回undefined method some_method,而不是调用其子类上的方法。

在不需要再次查询的情况下,将方法发送到其子类的最佳方式是什么?我知道我可以这样做,但这似乎很难

class Exam < ActiveRecord::Base
def some_method
if self.type == "SAT"
SatTest.find(self.id).some_method
elsif self.type == "ACT"
ActTest.find(self.id).some_method
end
end
end

UPDATE关于类型字段,我已经编辑了上面的模型(在我的应用程序中将其重命名为test_type)。我用的是钢轨4.2.1。

Rails将初始化正确的对象,如果STI设置正确(即exams表有type:string列或在exam模型上定义了self.inheritance_column)

如果查询返回Exam的实例,则意味着test_type列为空/nil,或者STI设置不正确。

class Exam < ActiveRecord::Base
self.inheritance_column = :test_type
def some_method
"called from Exam"
end
end
class ActTest < Exam
def some_method
"called from ActTest"
end
end
class SatTest < Exam
def some_method
"called from SatTest"
end
end

在控制台中试用

Exam.create name:'SAT', test_type:'SatTest'
=> #<SatTest id: 1, name: "SAT", test_type: "SatTest", created_at: "2015-04-20 01:52:43", updated_at: "2015-04-20 01:52:43"> 
exam = Exam.find 1
=> #<SatTest id: 1, name: "SAT", test_type: "SatTest", created_at: "2015-04-20 01:52:43", updated_at: "2015-04-20 01:52:43">
exam.some_method
=> "called from SatTest"

参考

最新更新