Rails4:如何将嵌套资源ID分配给另一个资源

时间:2016-08-27 06:41:21

标签: ruby-on-rails ruby ruby-on-rails-4

型号:

order&材料
订单 has_many 材料
材料belongs_to order

材料&用户
材料 has_may 用户
用户 belongs_to 材料

假设我创建了一个id = 20,order_id = 1的材料

在material_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传递给用户?

2 个答案:

答案 0 :(得分:0)

更改user.save后,您还需要user.material_id

      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

答案 1 :(得分: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在更新之前不会验证记录。但在这种情况下,这种行为实际上是首选。

相关问题