我编写了一个 gem,它允许将 Google 电子表格转换为 Rails 模型。这个过程的顺序包括创建所有模型,然后连接它们的关联,然后保存所有模型。它支持所有可用的关联类型,并且在每种情况下,创建模型、建立关联、然后保存模型都可以正常工作。例外情况如下:
我有一个简单的has_one, through
关联(为简洁起见省略了属性访问):
class Left < ActiveRecord::Base
has_many :middles, dependent: :destroy
has_many :rights, through: :middles
end
class Right < ActiveRecord::Base
has_one :middle, dependent: :destroy
has_one :left, through: :middle
end
class Middle < ActiveRecord::Base
belongs_to :left
belongs_to :right
end
我发现一些不一致的行为取决于关联分配的哪一方:
从右到左分配:
left = Left.new
right = Right.new
left.rights << right
left.middles #[]
right.middle #nil
left.save!
left.middles # <Middle theme_id: 1, archive_resource_id: 1 >
从右到左分配:
left = Left.new
right = Right.new
right.left = left
left.middles #[]
right.middle <Middle theme_id: nil, archive_resource_id: nil >
right.save!
right.middle # <Middle theme_id: nil, archive_resource_id: 1 >
这种行为似乎非常不一致。为什么是这样?为什么这是一种方式而不是另一种方式?有没有办法与两个未保存的记录建立这种关系?
我很欣赏显而易见的解决方案是在建立关系之前保存所有内容,但如上所述,我需要在建立关联时取消保存模型,并且在所有其他类型的关联中,这方面没有问题。