在应用程序中,国家/地区模型包含许多城市,有两种方法可以对所有城市执行操作。
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.destroy
和self.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]}
...
答案 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