has_manyな関連性のモデルを、元レコードの保存時に削除する
ActiveRecordでhas_manyを指定しているモデルを操作する画面を作る時に、以下の様な事で悩んでいた
class Account < ActiveRecord::Base
has_many :roles
end
class Role < ActiveRecord::Base
belongs_to :account
end
# コントローラー側のメソッド内
def update
account = Account.find_by(params[:id])
account.roles = [] #=> ここでrolesがdeleteされてしまう
params[:roles].each do | role |
# ...
end
unless account.save
render :action => "edit"
end
end
account.rolesにパラメータが来てないものは削除したいが、削除するために=[]とするとその時点で保存されてしまう
has_manyで保存時に作成するものはbuildで良いが、削除はどうするのか……
と探していたらあった。
has_many側の不要なやつはdeleteして更新したい
http://d.hatena.ne.jp/itmammoth/20120422/1335087511
def update
account = Account.find_by(params[:id])
params[:roles].each do | role |
# ...
end
account.roles.each do | role |
role.mark_for_destruction unless roles.map{|r| r[:name]}.include?(role.name)
end
unless account.save
render :action => "edit"
end
end
なお、このレコードが削除フラグが立っているかは marked_for_destruction?で見れば良い
role.marked_for_destruction?
もっと良い方法があれば是非教えてください
Author And Source
この問題について(has_manyな関連性のモデルを、元レコードの保存時に削除する), 我々は、より多くの情報をここで見つけました https://qiita.com/zenpou/items/c40d920c8dfc970240d9著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .