如果 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
这是设置
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