对模型关联对象执行批处理操作

时间:2012-03-22 04:43:58

标签: ruby-on-rails ruby-on-rails-3 activerecord

在应用程序中,国家/地区模型包含许多城市,有两种方法可以对所有城市执行操作。

class Country < ActiveRecord::Base
  has_many :cities

  def destroy_cities
    self.cities.each do |city|
      city.destroy
    end
  end

  def update_cities(new_status)
   self.cities.each do |city|
      city.status = new_status
    end
  end
end

我想知道是否有更简单的方法来编写这些方法,例如不存在的self.cities.destroyself.cities.status = new_status

从效率的角度来看,它会执行那些SQL查询:

DELETE FROM cities WHERE country_id=#{country_id}
UPDATE cities SET status=#{new_status} WHERE country_id=#{country_id}

而不是运行多个查询:

SELECT * FROM cities WHERE country_id=#{country_id}

DELETE FROM cities WHERE id=#{city_ids[0]}
DELETE FROM cities WHERE id=#{city_ids[1]}
DELETE FROM cities WHERE id=#{city_ids[2]}
...

1 个答案:

答案 0 :(得分:1)

您应该能够使用delete_all和update_all activerecord方法。

如果您只想保留国家/地区,但删除所有可以执行的城市;

def destroy_cities
  self.cities.delete_all
end

http://apidock.com/rails/ActiveRecord/Relation/delete_all

并且可以进行更新;

def update_cities(new_status)
  self.cities.update_all(:status => new_status)
end

http://apidock.com/rails/ActiveRecord/Relation/update_all