выполнение пакетных действий над объектами, связанными с моделью - PullRequest
0 голосов
/ 22 марта 2012

В приложении модель страны содержит много городов, и есть два метода, которые выполняют действия над всеми городами.

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]}
...

1 Ответ

1 голос
/ 22 марта 2012

Вы должны иметь возможность использовать методы activerecord delete_all и update_all.

Если вы просто хотите сохранить страну, но удалите все города, которые можете сделать;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...