无法使用“has_many through”delete_all关联的记录

时间:2013-06-04 11:37:35

标签: ruby-on-rails activerecord associations

我有3个型号:

Shedule

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'与“服务”相关联via:has_many。

经过一些谷歌搜索后,我发现this和其他一些类似的帖子,但所有这些帖子都不适合我的问题。

当然,我可以通过迭代像

这样的用户服务来删除它
my_user.services.each do |s|
    s.shedules.delete_all
end

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

谢谢!

3 个答案:

答案 0 :(得分:2)

找到了比以前介绍的解决方案更简单的解决方案。

int[] customOrder = { 100, 0, 50, 150, 250, 500, 1000, 2500, 5000, 10000, 50000 };
var Result = lstQuatationResult
    .OrderBy(x => x.planMaximum)
    .OrderBy(x => x.planDeductible)
    .OrderBy(x => Array.IndexOf(customOrder, x));

我之所以喜欢它,是因为它只是一个数据库查询,而且我不必记住外键的名字。

它之所以有效,是因为:

Schedule.merge(my_user.schedules).delete_all

答案 1 :(得分:1)

尝试: -

my_user.shedules.destroy_all

OR

Shedule.delete_all(:owner => my_user.id)

答案 2 :(得分: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