5

我有 3 个模型:

时间表

belongs_to :service

服务

belongs_to :user, :foreign_key => "owner"
has_many :shedules, :dependent => :destroy

用户

has_many :services, :foreign_key => "owner", :dependent => :destroy
has_many :shedules, :through => :services, :foreign_key => "owner", :dependent => :destroy

然后我可以通过my_user.shedules

我的目标是删除所有用户,然后我尝试my_user.shedules.delete_all但收到此错误:

ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection:无法修改关联“User#shedules”,因为源反射类“Shedule”通过:has_many 关联到“服务”。

经过一番谷歌搜索后,我发现了这个和其他一些类似的帖子,但它们都不适合我的问题。

当然我可以通过迭代用户服务来删除它,比如

my_user.services.each do |s|
    s.shedules.delete_all
end

但我很有趣为什么不my_user.shedules.delete_all工作。

谢谢!

4

3 回答 3

4

找到了一个比以前更简单的解决方案。

Schedule.merge(my_user.schedules).delete_all

我更喜欢这个,因为它只是一个数据库查询,我不必记住外键的名称。

它之所以有效,是因为:

Schedule.merge(my_user.schedules).to_sql == my_user.schedules.to_sql

于 2020-06-06T12:01:04.453 回答
1

尝试:-

my_user.shedules.destroy_all

或者

Shedule.delete_all(:owner => my_user.id)
于 2013-06-04T12:09:56.243 回答
0

我不确定您是否可以删除schedules使用关联。您可以通过自己查找这些记录来删除它们。

Shedule.where(service_id: user.services.pluck(&:id)).delete_all
user.reload # optional

如果你经常使用这个,你可以定义一个方法User

def delete_schedules
  Shedule.where(service_id: user.services.pluck(&:id)).delete_all
end
于 2016-11-04T20:28:38.007 回答