class Post < ActiveRecord::Base
has_many :posts_tags
has_many :tags, through: :posts_tags
end
class PostsTag < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
class Tag < ActiveRecord::Base
has_many :posts_tags
has_many :posts, through: :posts_tags
end
投稿が破棄されると、そのタグへの関連付けもすべて削除されます。 PostsTagモデルの検証を実行したくありません。私はちょうど削除したい。has_manyを削除する適切な方法:joinレコードを使用しますか?
Postモデルの投稿タグとの関係に依存関係を追加すると、希望通りに機能することがわかりました:has_many :posts_tags, dependent: :delete_all
ただし、この件に関するドキュメントでは、代わりにhas_many :tags, through: :posts_tags, dependent: :delete_all
を行う必要があるようです。これを行うと、Tagオブジェクトが破棄され、結合オブジェクトが残ります。 has_manyのために
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many
、破棄コールバックが実行されるように、常に削除されたレコード(複数可)のdestroyメソッドを呼び出します。ただし、deleteは:dependentオプションで指定された方針に従って削除を実行するか、またはno:dependentオプションが指定されていれば、デフォルト戦略に従います。デフォルトの戦略は以下のとおりです。nullify(外部キーをnilに設定)、has_many:throughを除き、デフォルト戦略はdelete_allです(コールバックを実行せずに結合レコードを削除します)。私は実際に使用されるデフォルトの戦略を持つことができますどのように
- ?私が離れると:依存を完全にオフにしても、レコードは一切削除されません。私はhas_many関係に依存しているだけでは意味がありません。 Railsが戻ってきて、 ":依存オプションは、destroy、:delete_all、:nullify、または:restrict({})"のどちらかを期待します。
- 私は指定しない場合は、次の関係のいずれかに依存し、おそらく、私はこの間違ったと私が見つけたのアプローチを読んでいます
示唆しているようだとして、それがPostsTagオブジェクトにpost_idのを無効にしません作品は正しい方法ですか?
複数の投稿でタグを使用するとどうなりますか? 1つの投稿が削除されると、他の投稿にも影響が及ぶでしょう。 –
が真で、Tagに 'has_many:posts、through::posts_tags'が投稿されていない場合は、' has_many:posts_tags、dependent::destroy'を使ってposts_tagを削除してタグを残しておきます。レーキタスクまたはコンソールで孤立したタグを削除できます。 – rmagnum2002
関連付けを修正しました。ありがとうございます。私はドキュメントを理解しようとしています。言葉は混乱しています – Brian