2016-08-27 71 views
0

型號:Rails4:如何嵌套資源標識分配給另一個資源

爲了&材料
爲了的has_many 材料
材料belongs_to的順序

材料&用戶
材料 has_may 用戶
用戶 belongs_to的材料

假設我創建具有ID = 20的材料,ORDER_ID = 1

在materials_controller更新動作,我要分配材料id給特定用戶。在materials_controller更新操作中,我做了這樣的操作

if @material.update_attributes(material_params) 
     if @material.ready == true 
     @users = User.where("is_manager = 't'") 
     @users.each do |user| 
      user.material_id = @material.id 
     end 
     end 
    end 

但是在操作之後用戶中的屬性material_id沒有被更改。 任何人都可以告訴我什麼原因導致無法將材料ID傳遞給用戶?

+0

您在更改user.material_id後還需要執行user.save' – kiddorails

回答

0

在更改user.material_id後,您還需要執行user.save

 user.material_id = @material.id 
     user.save #Saves the changes 

這改變user對象的屬性,但更改尚未持久化。它現在是一個陳舊的對象,它有一些屬性發生了變化。要堅持這些屬性,user.save是必需的。

或者你可以使用update_attribute象下面這樣:

if @material.update_attributes(material_params) 
    if @material.ready 
    @users = User.where("is_manager = 't'") 
    @users.each do |user| 
     user.update_attribute(:material_id, @material.id) 
    end 
    end 

+0

感謝您的幫助。在我嘗試使用user.save後,它仍然不起作用。你可以想象導致這個問題的其他原因是什麼? –

+0

@MarcoSong添加日誌記錄並檢查您的development.log中是否有任何錯誤 - https://gist.github.com/anonymous/e19d85fb70e4463b854d8d56f2f07c13 – kiddorails

+0

謝謝!偉大的方式來查看錯誤消息。它顯示我 - >出現錯誤 - [「密碼不能爲空」,「密碼太短(最少6個字符)」] 因此,當我改變使用update_attibute它的作品!用戶密碼驗證導致失敗。 –

0

你可能想看看update_all

update_all更新中的所有記錄一個 SQL語句,而不是將所有記錄加載到內存中,並向數據庫發送N個更新查詢。這使得update_all比迭代多個用戶快得多。

if @material.ready 
    User.where(is_manager: 't').update_all(material_id: @material.id) 
end 

往往是一個問題,那update_all不更新前驗證記錄。但在這種情況下,這種行爲實際上是首選。

+0

@spikermann非常感謝您提供的建議。 –