2010-07-05 343 views
4

在我的控制器中,我在for循環中調用@ hour.shopper.add_product。軌道模型中的虛擬屬性

我的模型看起來像:

class Shopper < ActiveRecord::Base 

    attr_accessor :quantity 

    def add_product 
    if self.quantity.nil? || \ 
     self.quantity == 0 
     self.quantity = 1 
    else 
     self.quantity += 1 
    end 
    self.save 
    end 

end 

當我打印@ hour.shopper.quantity它總是說 '零'。它好像不是在@ hour.shopper對象中保存數量屬性。

在此先感謝!

回答

7

嗯,是的,實例變量不會保存到數據庫(它們怎麼可能?沒有列)。由於問題的標題是「虛擬屬性」,因此我假設您的數據庫表中沒有數量列(如果這樣做,只需刪除attr_accessor位),但是您仍然如果您希望保存數量,則需要將數量存儲在某個地方。

當某些屬性不是直接存儲在數據庫中時,通常會使用虛擬屬性,但可以從屬性轉換爲屬性。在這種情況下,情況並非如此,所以我只能建議您向數據庫表中添加數量列。

+0

我不需要數量屬性來堅持。我想它是一個實例變量。我認爲使它成爲虛擬屬性會使它成爲對象生命週期中模型對象的屬性(在這種情況下爲@ hour.shopper)。 – Russell 2010-07-05 16:04:06

+0

@ sbox32:確實如此。然而,每當你做'@ hour.shopper'時,你都不會得到同樣的對象。如果你做'shopper = @ hour.shopper',然後對'shopper'進行操作,只要'shopper'在範圍內,'quantity'的值就會持續。 – sepp2k 2010-07-05 16:06:19

+0

我明白了,我印@ hour.shopper: #<購物:0xb65d805c> #<購物:0xb658be64> #<購物:0xb657e930> 我想這是我的問題的癥結所在。 我通過@hours循環,所以我的代碼看起來是這樣的:在@hours做 @ hour.shopper.add_product 所以我不能做購物者= @ hour.shopper因爲那將創造 爲@hour儘可能多的對象有@小時(我猜是無論如何正在發生的事情)。 理想情況下,我希望@ hour.shopper對象以每個購物者爲基礎。如果購物者x再次出現,購物者x的@ hour.shopper對象將成爲相同的@ hour.shopper對象。 – Russell 2010-07-05 16:26:22