のせいで、
親モデルと同時に子モデルをsave
する時
子モデルがinvalid
だったら、親モデルも保存しない。
これがhas_one
では素直にできませんでした。
class Parent < ActiveRecord::Base
has_one :first_child
validates :name, presence: true
end
class FirstChild < ActiveRecord::Base
validates :name, presence: true
end
parent = Parent.new(name: 'Oya')
parent.first_child = FirstChild.new
parent.save
# => true
parent.valid? # => true
parent.persisted? # => true
parent.first_child.valid? # => false
parent.first_child.persisted? # => false
has_many
と同じ挙動を期待していますが、
FirstChild
がinvalid
なのに、Parent
が保存されてしまいます。
Parent
が保存されないようにするには、このようにします。
class Parent < ActiveRecord::Base
has_one :first_child, validate: true
validates :name, presence: true
end
class FirstChild < ActiveRecord::Base
validates :name, presence: true
end
parent = Parent.new(name: 'Oya')
parent.first_child = FirstChild.new
parent.save
# => false
parent.valid? # => false
parent.persisted? # => false
parent.first_child.valid? # => false
parent.first_child.persisted? # => false
has_one
を宣言する時に、validate
オプションをtrue
にすると
期待通りになります。
ちなみにhas_many
は、このオプションはデフォルトでtrue
です。