使用STI时如何将ActiveRecord对象强制转换为另一个类?

时间:2010-08-06 21:30:24

标签: ruby-on-rails ruby activerecord casting single-table-inheritance

我目前正在使用ActiveRecord单表继承。

如何将我的一个模型从A类投射到B?他们有同一个父母。

4 个答案:

答案 0 :(得分:42)

答案 1 :(得分:5)

您不需要强制转换,因为Ruby在编译时不执行任何类型检查。你想要完成什么?

假设您有一个班级Dad,以及子班级SonDaughter

您可以只拥有一个变量@dad,并在其中存储SonDaughter对象,并将其视为Dad。只要他们回应相同的方法,它就没有区别。这是一个名为“鸭子打字”的概念。

答案 2 :(得分:0)

如果我们有以下操作

class A < ApplicationRecord
end

Class B < A
end

我们可以使用成为

a = A.first
b = a.becomes(B)

反之亦然

答案 3 :(得分:-2)

创建B的新实例,以设置与A共享的属性的值。

类似的东西:

class C < ActiveRecord::Base
end

class A < C
end

class B < C
end

@a = A.new(...)
@b = B.new(@a.attr1, @a.attr2, ..., @a.attrN)