2013-08-27 46 views
0

如果我在用戶控制器中創建一個用戶的實例變量,然後嘗試添加到一個字段數組,我可以看到它已被添加,但是當我去保存時,它會不救Rails bug?更新實例變量數組並不總是工作

@instructor = User.find(current_user.id) 
@instructor.clients = @instructor.clients << User.last.id 
@instructor.save 

當我然後去撬,做完全相同的操作有一個實例變量我在撬創建,它不保存。爲什麼是這樣的,我怎樣才能讓它在控制器中工作?

數組字段是一個postgres數組數組。

+2

定義「不保存」。你有錯誤嗎? 'save'是否返回'false'?記錄是否沒有出現在數據庫中?你是肯定的,你正在運行*完全*只有這三條線? –

+3

不是您的問題的答案,但您可以使用'@instructor.clients << User.last_id'。賦值('@instructor.clients = @ instructor.clients << User.last_id')是多餘的。 – lurker

+0

沒有錯誤,它返回true。實際上,當我在pry中時,我嘗試從控制器中保存實例變量,它將其保存爲try,但實際上並不保存該記錄。對我在pry中製作的實例變量進行同樣精確的操作,它會保存true並保存記錄 – user1149547

回答

2

您的問題是這樣的:

@instructor.clients = @instructor.clients << User.last.id 

不實際的方式,ActiveRecord的會知道改變@instructor.clients

例如:

>> a = [ ] 
>> b = a << 6 
>> b.object_id 
=> 2165471260 
>> a.object_id 
=> 2165471260 

object_id是指在同一個陣列,沒有人(但你)會知道a實際上已經改變了。

所以@instructor.clients是你加User.last.id到它之前,因爲它是你推User.last.id後到它和ActiveRecord的不會意識到你已經改變了什麼相同的對象。然後你@instructor.save,它沒有成功。

您需要創建一個新的數組:

@instructor.clients = @instructor.clients + [ User.last.id ] 

Array#+創建一個全新的陣列,這將讓ActiveRecord的知道事情有了變化。然後你的@instructor.save實際上會將新的數組寫入數據庫,並且下次將該指導員從數據庫中拉出時,更新的數組將會在那裏。

+0

非常感謝!我不知道。 – user1149547