はじめに

多対多のリレーションで関連付けたいときはattach!と覚えていたのですが
中間テーブルにユニーク制約を貼ってる場合にattachを連続で実行してしまうとエラーになる。。
(ユニーク制約がなければ同一レコードが複数できる)
うーん、困った。
そんなときはsyncWithoutDetaching を使いましょう。

挙動の違い

  • attach
    • 常にinsert
  • syncWithoutDetaching
    • なければinsert、あれば何もしない

ということで、AとBの関係性が

  • 複数あり得る場合はattach
  • 最大1つの場合はsyncWithoutDetaching

が良いよ!

公式のサンプルではユーザーにロールを与える際にattachをしていますが
一人のユーザーに同じ権限を複数与える(Aさんにadmin権限2個)といったことはないので
syncWithoutDetaching がオススメ。

attachの使い所

  • 買い物カゴに商品を入れる
    • 同じ商品を複数入れる可能性があるため
  • (パッと思い付かないな)

syncWithoutDetachingの使い所

  • 商品をお気に入り登録する
  • ユーザーにロールを与える

Tags:

Updated: