destroy_all不会为has_many通过每个对象调用destroy

时间:2013-09-23 19:20:59

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2

我以这种方式设置了关联。

class Program
  has_many :program_activities, dependent: :destroy
  has_many :recent_activities, through: :program_activities, source: :recent_activity
end

class RecentActivity
  has_many :program_activities, dependent: :destroy        
end

我想删除与程序对象关联的recent_activities。

program.recent_activities.destroy_all

但是上面的查询实际上只是删除了(请注意删除而不是销毁)program_activities并单独保留recent_activities对象。

我通过检查rails控制台查询找到了这个问题,destroy_all方法是否有问题或者我是否真的错误地设置了关联。

3 个答案:

答案 0 :(得分:0)

对我来说没有什么不对,这在多对多的关系中是正常的。

如果recent_activity与一个且仅program相关,则您不应该拥有program_activities关系模型。你只需要使用belongs_to :program的RecentActivity,删除就可以了。

在您的情况下,您认为recent_activity可能有多个programs。因此删除program不能删除recent_activity实体,因为根据定义,它可以属于多个程序。它只会删除这段关系。

答案 1 :(得分:0)

我认为没有错。在销毁模型行时,通常可以删除关联表。

假设这种情况:

  1. 群组has_many group_members

  2. 会员has_many group_members

  3. 通过group_members

  4. 分组has_many成员
  5. 会员has_many group through group_members

  6. 当我们摧毁一个团体时,这意味着什么,相关成员也应该被销毁?它们是独立的模型行,即使没有任何组。也许他们是其他团体。如果它们被级联破坏,数据表将会很混乱。

    希望这个例子可以解释逻辑。

答案 2 :(得分:0)

最近遇到了这个问题,这最终对我有用:

program.program_activities.each { |activity| activity.recent_activity.destroy }

并非十分简洁,但是由于destroy_all方法无法达到您的预期,因此这可能是最好的。它确实会触发销毁,因此在您的情况下,它将与它关联。如果您没有设置了依赖性::destroy,则会收到外键冲突。