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 方法是否有问题,或者我实际上是否错误地设置了关联。

4

3 回答 3

0

对我来说没有错,在多对多的关系中很正常。

如果 arecent_activity与 one and only one 相关program,则不应该有program_activities关系模型。您只需要使用带有 abelongs_to :program的 RecentActivity 就可以了。

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

于 2013-09-23T20:05:04.517 回答
0

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

假设这种情况:

  1. 组 has_many group_members

  2. 成员 has_many group_members

  3. 通过 group_members 分组 has_many 成员

  4. 成员 has_many 通过 group_members 组

是不是说我们灭了一个群,相关的成员也该灭了?它们是独立的模型行,即使没有任何组。也许他们属于其他群体。如果它们被级联破坏,数据表就会乱七八糟。

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

于 2013-09-25T16:09:08.873 回答
0

最近遇到了这个,这就是最终为我工作的原因:

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

不完全简洁,但由于 destroy_all 方法没有达到您的预期,这可能是最好的。它确实会触发销毁,因此在您的情况下,它将与之关联。如果您没有dependent: :destroy 设置,您将获得外键违规。

于 2019-09-03T16:38:55.190 回答