2013-06-05 11 views
12
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です(コールバックを実行せずに結合レコードを削除します)。私は実際に使用されるデフォルトの戦略を持つことができますどのように

  1. ?私が離れると:依存を完全にオフにしても、レコードは一切削除されません。私はhas_many関係に依存しているだけでは意味がありません。 Railsが戻ってきて、 ":依存オプションは、destroy、:delete_all、:nullify、または:restrict({})"のどちらかを期待します。
  2. 私は指定しない場合は、次の関係のいずれかに依存し、おそらく、私はこの間違ったと私が見つけたのアプローチを読んでいます

示唆しているようだとして、それがPostsTagオブジェクトにpost_idのを無効にしません作品は正しい方法ですか?

+1

複数の投稿でタグを使用するとどうなりますか? 1つの投稿が削除されると、他の投稿にも影響が及ぶでしょう。 –

+0

が真で、Tagに 'has_many:posts、through::posts_tags'が投稿されていない場合は、' has_many:posts_tags、dependent::destroy'を使ってposts_tagを削除してタグを残しておきます。レーキタスクまたはコンソールで孤立したタグを削除できます。 – rmagnum2002

+0

関連付けを修正しました。ありがとうございます。私はドキュメントを理解しようとしています。言葉は混乱しています – Brian

答えて

17

のあなたのオリジナルのアイデア:

has_many :posts_tags, dependent: :delete_all 

は正確に何をしたいです。 ではないは、many-thoughという関連で:tagsと宣言したいので、関連するすべてのタグが破棄されます。削除したいのはアソシエーションそのものです。これは、PostTag結合モデルが表すものです。

なぜドキュメントは彼らが何をしているのですか?

Post.find(1).destroy 
Post.find(1).tags.delete 

最初の呼び出し(あなたのシナリオ)は単にポストを破壊するだけです。つまり、:dependent戦略を指定しない限り、私はあなたに提案します。 2番目の呼び出しは、ドキュメントが記述しているものです。 .tags.deleteをコールすると(実際にはhas-many-throughによって結合されているため)実際にはタグは破棄されませんが、これらのタグを結合する関連する結合モデルが破棄されます。

+0

ああ、感謝するより感謝 – Brian

関連する問題