Ruby通过关联删除多个对象

Jef*_*vic 0 ruby

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

这种方法似乎有效,但我希望如果可能的话,将其"擦除"到一行.

  @consultancy.teams.reverse.each do |team|
    team.destroy if team.users.count < 2 
  end
Run Code Online (Sandbox Code Playgroud)

我正在尝试做更多类似下面的事情,但我收到了拒绝的错误!方法.

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

NoMethodError: undefined method `reject!' for #<Team::ActiveRecord_Associations_CollectionProxy:0x00000003f72850>
Run Code Online (Sandbox Code Playgroud)

.delete_all也会抛出错误.

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

NoMethodError: undefined method `delete_all' for #<Array:0x0000000b72dcf0>
Run Code Online (Sandbox Code Playgroud)

提前感谢您的任何见解.

Ste*_*zyn 8

select作用于数组,但是delete_all是一个活动的记录关系方法.

你可以做到

@consultancy.teams.select{|x| x.users.count < 2}.map(&:delete)
Run Code Online (Sandbox Code Playgroud)

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

@consultancy.teams.joins(:users).group('teams.id').having('count(users.id) < 2').destroy_all
Run Code Online (Sandbox Code Playgroud)