该指南没有说明association=
方法的返回值。例如has_one association=
对于简单的情况,它返回分配的对象。但是,这仅在分配成功时进行。
有时association=
会立即将更改保存在数据库中,例如设置has_one关联的记录。
association=
应对分配失败?(我可以告诉它是否失败吗?)因此,该指南的另一部分确实讨论了关联分配的返回行为。
如果关联分配失败,则返回false。没有这个的爆炸版本。
周围:has_many / has_one的行为似乎有所不同。
演示资料库:https : //github.com/lulalalalistia/association-assignment-demo
在演示中,我在第一次提交中植入了一些数据,在第二次提交中植入了硬代码验证错误。演示使用Rails 4.2
class Boss < ActiveRecord::Base
has_many :room_ownerships, as: :owner
has_many :rooms, through: :room_ownerships
end
当我添加房间时,会引发异常:
irb(main):008:0> b.rooms << Room.first
Boss Load (0.2ms) SELECT "bosses".* FROM "bosses" ORDER BY "bosses"."id" ASC LIMIT 1
Room Load (0.1ms) SELECT "rooms".* FROM "rooms" ORDER BY "rooms"."id" ASC LIMIT 1
(0.1ms) begin transaction
(0.1ms) rollback transaction
ActiveRecord::RecordInvalid: Validation failed: foo
irb(main):014:0> b.rooms
=> #<ActiveRecord::Associations::CollectionProxy []>
class Employee < ActiveRecord::Base
has_one :room_ownership, as: :owner
has_one :room, through: :room_ownership
end
当我添加房间时,我不会出现异常:
irb(main):021:0> e.room = Room.first
Room Load (0.2ms) SELECT "rooms".* FROM "rooms" ORDER BY "rooms"."id" ASC LIMIT 1
RoomOwnership Load (0.1ms) SELECT "room_ownerships".* FROM "room_ownerships" WHERE "room_ownerships"."owner_id" = ? AND "room_ownerships"."owner_type" = ? LIMIT 1 [["owner_id", 1], ["owner_type", "Employee"]]
(0.1ms) begin transaction
(0.1ms) rollback transaction
=> #<Room id: 1, created_at: "2016-10-03 02:32:33", updated_at: "2016-10-03 02:32:33">
irb(main):022:0> e.room
=> #<Room id: 1, created_at: "2016-10-03 02:32:33", updated_at: "2016-10-03 02:32:33">
这使得很难查看分配是否成功。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句