2013-06-30 63 views
0

我在Rails中遇到了一個奇怪的問題。我想在Rails的模型中設置一個字段的值,但是我不能這樣做,即使在rails控制檯中也是如此。注意:在Rails中設置模型的值

1.9.3p393 :008 > campy = Campaign.last 
    Campaign Load (0.8ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> #<Campaign id: 3, name: "Stuff", ..., approved_at: nil, approval_requested_at: nil> 
1.9.3p393 :009 > campy.approved_at = Time.now 
=> 2013-07-01 00:54:38 +0200 
1.9.3p393 :010 > campy.save 
    (0.2ms) BEGIN 
    (0.2ms) COMMIT 
=> true 
1.9.3p393 :011 > campy.approved_at 
=> 2013-07-01 00:54:38 +0200 
1.9.3p393 :012 > Campaign.last.approved_at 
    Campaign Load (0.7ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> nil 
1.9.3p393 :013 > campy = Campaign.last 
    Campaign Load (0.6ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> #<Campaign id: 3, name: "Stuff", ..., approved_at: nil, approval_requested_at: nil> 
1.9.3p393 :014 > campy.approved_at = Time.now 
=> 2013-07-01 00:55:11 +0200 
1.9.3p393 :015 > campy.save 
    (0.3ms) BEGIN 
    (0.2ms) COMMIT 
=> true 
1.9.3p393 :016 > Campaign.last.approved_at 
    Campaign Load (0.7ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> nil 

我想設置的最後一個活動的approved_at屬性Time.now的價值,但它仍然是零,即使是在我保存它。 approved_at可通過Campaign模型頂部的attr_accessor功能使用。爲什麼我無法更改此屬性的值?

編輯:

問題的另一個有趣的方面是,當我設置campy.approved_at,然後查找值明確,我得到正確的值。然而,當我看着裝模作樣作爲一個變量時,Rails仍然顯示值爲零

1.9.3p393 :027 > campy.approved_at = Time.now 
=> 2013-07-01 01:19:05 +0200 
1.9.3p393 :028 > campy.save 
    (0.2ms) BEGIN 
    (0.2ms) COMMIT 
=> true 
1.9.3p393 :029 > campy.approved_at 
=> 2013-07-01 01:19:05 +0200 
1.9.3p393 :030 > campy 
=> #<Campaign id: 3, name: "Stuff", ... , approved_at: nil, approval_requested_at: nil> 
+0

'campy.update_attribute:approved_at,Time.now'呢? –

+0

你能通過檢查它的'id'來驗證你是否每次都獲得相同的記錄嗎? –

+0

Campy和Campaign.last的Campaign idd均爲3。使用update屬性也不會設置approved_at。 –

回答

2

這是因爲你創建approved_atattr_accessor虛擬屬性。我建議你閱讀attr_accessorattr_accessible,但在這種情況下你不需要。

通過將其指定爲虛擬屬性,它不會持久保存到數據庫。刪除attr_accessor行,你不會有任何問題。

說明:

attr_accessor創建吸氣劑用於在該模型在內存中的屬性的設置方法。這將優先於ActiveRecord爲您的基礎數據庫屬性自動生成的getter和setter方法,因此當您撥打save時,AR不認爲您已更新approved_at,因爲您確實沒有更新過,因此您已更新只有虛擬屬性。

attr_accessible用於允許對特定屬性進行批量分配,例如,如果您將該值作爲屬性散列的一部分傳遞給createnew

+0

正確,謝謝 –

+0

但是,現在當我檢查rspec中的campaign.approved_at時,出現錯誤:NoMethodError:未定義的方法'approved_at'。你確定我不需要attr_accessible嗎? –

+0

是的,考慮一下可能還有更多,因爲我不確定'attr_accessor'會覆蓋AR屬性。確保你是數據庫並且'schema.rb'包含那個屬性,你可能錯過了一個遷移或者其他東西。 –