我以这种方式设置了关联。
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方法是否有问题或者我是否真的错误地设置了关联。
答案 0 :(得分:0)
如果recent_activity
与一个且仅program
相关,则您不应该拥有program_activities
关系模型。你只需要使用belongs_to :program
的RecentActivity,删除就可以了。
在您的情况下,您认为recent_activity
可能有多个programs
。因此删除program
不能删除recent_activity
实体,因为根据定义,它可以属于多个程序。它只会删除这段关系。
答案 1 :(得分:0)
我认为没有错。在销毁模型行时,通常可以删除关联表。
假设这种情况:
群组has_many group_members
会员has_many group_members
通过group_members
会员has_many group through group_members
当我们摧毁一个团体时,这意味着什么,相关成员也应该被销毁?它们是独立的模型行,即使没有任何组。也许他们是其他团体。如果它们被级联破坏,数据表将会很混乱。
希望这个例子可以解释逻辑。
答案 2 :(得分:0)
最近遇到了这个问题,这最终对我有用:
program.program_activities.each { |activity| activity.recent_activity.destroy }
并非十分简洁,但是由于destroy_all方法无法达到您的预期,因此这可能是最好的。它确实会触发销毁,因此在您的情况下,它将与它关联。如果您没有设置了依赖性::destroy,则会收到外键冲突。