Уничтожить объект Rails 3 в граблях? - PullRequest
0 голосов
/ 10 июня 2011

Я застрял на простом вопросе здесь.Я создаю приложение, которое управляет базой данных купонов, каждый из которых имеет срок годности.Я пытаюсь построить грабли, которые будут удалять просроченные купоны.Соответствующий код из rakefile выглядит следующим образом:

desc "Deletes expired offers from the database."
task :purge_expired => :environment do
    today = Date.today.to_s            
    Offer.where('expires_on < ?', today).destroy
end

Однако это не сработает со следующим сообщением об ошибке:

rake aborted!
wrong number of arguments (0 for 1)

Я просто не уверен, почему.Какие аргументы понадобятся?

В качестве эксперимента я обнаружил, что это работает нормально:

desc "Deletes expired offers from the database."
task :purge_expired => :environment do
    today = Date.today.to_s            
    puts Offer.where('expires_on < ?', today).count
end

Это вернуло правильное количество записей, поэтому я предполагаю, что я успешно собираюправильные объекты.

FWIW, я тоже это попробовал, и мне не повезло:

desc "Deletes expired offers from the database."
task :purge_expired => :environment do
    today = Date.today.to_s
    @offers = Offer.where('expires_on < ?', today)
    @offers.destroy
end

Так что я как бы вне идей.Что я здесь не так делаю?

Большое спасибо за вашу помощь.Я уверен, что у меня не было бы работы, если бы не переполнение стека!

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Ты рядом.Вам просто нужно использовать метод #destroy_all вместо #destroy.Последний требует аргумента id.

today = Date.today.to_s            
Offer.where('expires_on < ?', today).destroy_all
1 голос
/ 10 июня 2011

Прежде всего, чтобы помочь отладить вещи с граблей, запустите его с опцией --trace. Ваша проблема здесь не зависит от рейка.

Offer.where('expires_on < ?', today) собирается вернуть коллекцию, а не один экземпляр Offer, и для коллекции нет метода destroy.

Вы можете перебирать каждое просроченное предложение и звонить destroy. Примерно так:

@offers = Offer.where('expires_on < ?', today)
@offers.each { |offer| offer.destroy }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...