Ruby通过关联删除多个对象

时间:2018-08-08 18:32:49

标签: ruby

我的应用程序需要销毁成员少于两个的所有团队。

该方法似乎可行,但是我希望尽可能将其“精简”到一行。

  @consultancy.teams.reverse.each do |team|
    team.destroy if team.users.count < 2 
  end

我正在尝试做以下类似的事情,但是拒绝却出错了!方法。

@consultancy.teams.reject!{|x| x.users.count < 2}

NoMethodError: undefined method `reject!' for #<Team::ActiveRecord_Associations_CollectionProxy:0x00000003f72850>

.delete_all也引发错误。

@consultancy.teams.select{|x| x.users.count < 2}.delete_all

NoMethodError: undefined method `delete_all' for #<Array:0x0000000b72dcf0>

在此先感谢您的见解。

1 个答案:

答案 0 :(得分:8)

select作用于数组,但是delete_all是活动记录关联方法。

你可以做

@consultancy.teams.select{|x| x.users.count < 2}.map(&:delete)

但是更好的方法可能是将计数选择作为查询的一部分。

@consultancy.teams.joins(:users).group('teams.id').having('count(users.id) < 2').destroy_all