class User < ActiveRecord::Base
end
class Consumer < User
end
class Merchant < User
end
u = User.find(id)
如何將變量u
轉換爲類型Consumer?在單表格繼承(STI)方案中的類型轉換基類模型
class User < ActiveRecord::Base
end
class Consumer < User
end
class Merchant < User
end
u = User.find(id)
如何將變量u
轉換爲類型Consumer?在單表格繼承(STI)方案中的類型轉換基類模型
由於STI一個bug,ActiveRecord的取景器被返回一個基類實例(用戶)而不是子類實例(消費者)。我認爲這是默認行爲,因此希望將基類實例(User)轉換爲子類實例(Consumer)。解決該錯誤後,我以前的解決方案變得多餘。 即
u = User.find(id) # returns an instance of Consumer class
您需要一個名爲'type'的列,rails會完成剩下的工作。例如:
id = Consumer.create!(...).id
# later on
User.find(id).is_a? Consumer # ==> true
我找到了答案。 ActiveRecord的:: Base類具有用於此目的的方法:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002334
的代碼將是
u = User.find(id)
u = u.becomes(u.type.constantize)
你總是可以得到一個消費者這樣:
u = Consumer.find(id)
如果您使用工廠女孩,這是你想要什麼:create(:consumer).becomes(Consumer)
否則,create(:consumer)
只產生User
對象。
成爲可以用來「僞造」記錄是給定類型的。和文檔一樣,這對於用於子類可能很有用。 在你的「解決方案」中,變得毫無用處,因爲u.class == u.type.constantize – 2009-11-30 19:33:16
Marc, 你是對的,但我的困惑是由於STI bug。我在第二個答案中解釋了它。 – 2009-11-30 22:45:39