如果 table 列在更新时发生更改,Assign_attributes 仅分配子 attr_accessor 值

Assign_attributes only assigns child attr_accessor values if a table column is changed on updates

这是设置

class Order
  has_many :items
  accepts_nested_attributes_for :items
end

class Item
  belongs_to :order
  attr_accessor :discount # this is NOT a table column, just a virtual attribute I want to be able to assign
end

假设我有一个现有订单 @order。我注意到,如果我尝试将 discount 分配给 Order 模型中的子对象 Item,这仅在子对象 Item 的某些其他属性发生更改时才有效。

@order.assign_attributes({"items_attributes"=>[{"id"=>40, "discount"=>"test"}]})
@order.items.first.discount
=> nil

@order.assign_attributes({"items_attributes"=>[{"id"=>40, "discount"=>"test", "admin_notes"=>"hello"}]})
# where admin_notes is a table column for Item
@order.items.first.discount
=> "test
@order.items.first.admin_notes
=> "hello"

是否有快速设置更改或其他更改?我希望 attr_accessor 属性始终被分配,即使没有属性发生变化?

我看到你原来的问题要求能够使用 attr_accessor,但它似乎不可能。我只能通过删除 attr_accessor.

才能使它正常工作

看起来 attr_accessor 实际上具有相反的行为,即在使用 accepts_nested_attributes_for 时使属性不可访问而不是允许它。也许是一个错误?文档不提供任何示例。只要你在控制器端做 params.permit,没有 attr_accessor.

仍然可以安全使用
class Order
  has_many :items
  accepts_nested_attributes_for :items
end

class Item
  belongs_to :order
end

从 Rails 控制台调用它:

@order = Order.find(1)
@order.assign_attributes({"items_attributes"=>[{"id" => 1, "discount_cents" => "234"}]})
@order.save

#  Order Load (0.4ms)  SELECT "orders".* FROM "orders" WHERE "orders"."id" =  LIMIT   [["id", 1], ["LIMIT", 1]]
#  Item Load (0.3ms)  SELECT "items".* FROM "items" WHERE "items"."order_id" =  AND "items"."id" =   [["order_id", 1], ["id", 1]]
#   (0.1ms)  BEGIN
#  Item Update (0.3ms)  UPDATE "items" SET "discount_cents" =  WHERE "items"."id" =   [["discount_cents", 234], ["id", 1]]
# => true
#   (5.8ms)  COMMIT

@order.assign_attributes({"items_attributes"=>[{"id" => 1, "discount_cents" => "789"}]})
# => nil
#  Item Load (0.4ms)  SELECT "items".* FROM "items" WHERE "items"."order_id" =  AND "items"."id" =   [["order_id", 1], ["id", 1]]
@order.items.first.attributes
# => {"order_id"=>1, "id"=>1, "discount_cents"=>789}

希望能为您的问题提供解决方案:)

FWIW 如果有人无意中发现了这个……它似乎已经自行解决了。今天正在做其他事情,发现我不能再重复原来的错误了。代码发生了很多变化,不会回头深入研究以弄清楚发生了什么。我知道可能影响此的关键配置变量没有改变,例如,inverse_of 两个模型上的标志设置,Order 模型设置为 accepts_nested_attributes_for :items