在单表继承(STI)方案中键入Casting基类模型

时间:2009-11-30 18:57:11

标签: ruby-on-rails ruby

class User < ActiveRecord::Base   
end  

class Consumer < User 
end  

class Merchant < User 
end   

u = User.find(id)  

如何键入变量u到Consumer类型?

5 个答案:

答案 0 :(得分:14)

我找到了答案。 ActiveRecord :: Base类有一个用于此目的的方法:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002334

代码将是

u = User.find(id)
u = u.becomes(u.type.constantize)

答案 1 :(得分:2)

由于STI中有bug,ActiveRecord finder返回基类实例(User)而不是子类实例(Consumer)。我认为这是默认行为,因此希望将基类实例(User)强制转换为子类实例(Consumer)。在解决了这个bug之后,我之前的解决方 即。

u = User.find(id) # returns an instance of Consumer class

答案 2 :(得分:1)

你需要一个名为'type'的列,rails将完成其余的工作。例如:

id = Consumer.create!(...).id

# later on

User.find(id).is_a? Consumer  # ==> true

答案 3 :(得分:1)

您可以随时获得消费者:

u = Consumer.find(id)

答案 4 :(得分:0)

如果你正在使用Factory Girl,这就是你想要的:create(:consumer).becomes(Consumer)

否则,create(:consumer)仅生成User个对象。