2009-11-30 53 views

回答

2

由於STI一個bug,ActiveRecord的取景器被返回一個基類實例(用戶)而不是子類實例(消費者)。我認爲這是默認行爲,因此希望將基類實例(User)轉換爲子類實例(Consumer)。解決該錯誤後,我以前的解決方案變得多餘。 即

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

您需要一個名爲'type'的列,rails會完成剩下的工作。例如:

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

# later on 

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

我找到了答案。 ActiveRecord的:: Base類具有用於此目的的方法:

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

的代碼將是

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

成爲可以用來「僞造」記錄是給定類型的。和文檔一樣,這對於用於子類可能很有用。 在你的「解決方案」中,變得毫無用處,因爲u.class == u.type.constantize – 2009-11-30 19:33:16

+0

Marc, 你是對的,但我的困惑是由於STI bug。我在第二個答案中解釋了它。 – 2009-11-30 22:45:39

1

你總是可以得到一個消費者這樣:

u = Consumer.find(id) 
0

如果您使用工廠女孩,這是你想要什麼:create(:consumer).becomes(Consumer)

否則,create(:consumer)只產生User對象。