2016-08-27 38 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非常感谢您提供的建议。 –