class User < ActiveRecord::Base
end
class Consumer < User
end
class Merchant < User
end
u = User.find(id)
如何键入变量u
到Consumer类型?
答案 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
个对象。