2017-08-01 6 views
0

HABTM関係に関連付けられているレールモデルArticleUserがあります。 Userは多くの記事を持ち、Articleは多くのUserに属することができます。 私はレコードを削除するのに苦労しています。 、ユーザーは他のユーザーに関連付けられていない記事を削除した場合、私は完全に記事を削除したいHABTMアソシエーションからレコードを完全に部分的に削除するには

  • 意味、Articleテーブルからだけでなく、Articleが関連している他のすべてのテーブルから記事を削除します。私の要件がありますhas_manyアソシエーション(私はArticleLinksArticleMetaTagsなどArticleモデルに関連する他のモデルを持っています)。
  • Articleも他のものと関連付けられている場合は、Userを削除してください。 UserArticleの関連付けを削除するだけです。

ありがとうございました。

答えて

0

あなたは常にArticleUserためbefore_destroyコールバックで(参加モデル)それを実装することができます:あなたは1を持っていない場合は、それを作成し、変更する必要が

class ArticleUser 
    belongs_to :article 
    belongs_to :user 

    after_destroy do 
    article.destroy if article.article_users.empty? 
    end 
end 

has_and_belongs_to_manyからhas_many

class Article 
    has_many :article_users 
    has_many :users, through: :article_users 
end 

class User 
    has_many :article_users 
    has_many :articles, through: :article_users 
end 

これはもう少しコードですが、より柔軟性があります。

しかし、私は、いくつかのサービス・クラスでのようなもの、それを実装することをお勧めしたい:

class ArticleUsers::Delete 
    attr_accessor :article_user 

    def initialize(article_user) 
    self.article_user = article_user 
    end 

    def destroy 
    if article_user.destroy 
     article_user.article.destroy 
    end 
    end 
end 

をそしてArticleUsers::Delete.new(article_user).destroy

としてあなたが必要とするどこにでもそれを呼び出し、予防措置として、あなたはrestrict_with_exceptionを追加することができますarticle_usersアソシエイトをArticleクラスに追加しました。記事を削除するための明示的なロジックがない場合。関連するレコードがある場合に例外が発生します。

class Article 
    has_many :article_users, dependent: :restrict_with_exception 
end 
+0

私は結合テーブルのモデルを持っていません。 CreateJoinTableArticleUserを使用して作成しました。私は結合テーブルのモデルを作成することをお勧めしますか?それはhas_manyではないでしょうか?その場合の関係を通して? –

+0

さて、article_usersのモデルを作成する必要があります。 'Article'は' ArticleUser'をたくさん持ち、article_usersを通して多くの 'User'を持っています。ユーザーにとっても同じです。私は私の答えを更新します。 –

+0

そして、私が上記のように、私はArticle has_many ArticleLink関連の記事に関連するArticleLinkモデルも持っています。記事を削除すると、記事に関連するすべてのArticleLinkが削除されますか?これをどのように実装すればよいですか?そして、あなたの時間に感謝します。 –

関連する問題