2

私は次のモデルを持っています:

User (id)
Project (id)
Permission (project_id, user_id)
Thread (project_id)
ThreadParticipation (thread_id, user_id)

それはうまくいっていますが、問題はこれです。ユーザーがプロジェクトから離れたり削除されたりした場合、そのプロジェクトのすべての ThreadParticipation を削除する必要があります。

たとえば、user(15) がパーミッション (user_id =>15、project_id => 3) を削除して project(3) を離れた場合、関連するすべての ThreadParticipation レコードを自動的に削除するレールが必要です (スレッドを介した ThreadParticipation は project_id に属します)。 3、および ThreadParticipation.user_id = 15。

私はこれを試しましたが、何もしていません:

has_many :thread_participations, :foreign_key => :user_id, :dependent => :destroy

考え?ありがとう

4

3 に答える 3

2

deleteおそらく代わりに使用していますdestroyか?を使用destroyすると、依存関係が削除されますが、そうではありdeleteません。これを見る

于 2011-02-15T01:34:19.830 に答える
1

これを試して:

class Project
  has_many :threads
  has_many :thread_participations, :through => :threads      
end

class Permission
  belongs_to :project

  after_destroy :destroy_thread_participations

  def destroy_thread_participations
    ThreadParticipation.delete_all(
      :id => project.thread_participations.find_all_by_user_id(user_id)
    )
  end
end

モデルにコールバックがある場合destroy_allの代わりに使用します。この呼び出しは、1つのDB呼び出しで複数の行の削除を実行し、コールバックを呼び出すオーバーヘッドがないため、より高速です。delete_all*_destroyThreadParticipationdelete_alldestroy_all*_destroy

于 2011-02-15T00:10:35.067 に答える
1

モデルで、次のPermission操作を行います。

before_destroy :delete_thread_participation

private
      def delete_thread_participation
         if self.threadparticipation 
           self.threadparticipation.delete_all "project_id ="+self.project_id+"and user_id="+self.user_id
         end
      end

これは、モデルで定義された関係があることを考慮しています

于 2011-02-14T23:06:37.997 に答える