2015-10-19 3 views
1

У меня был следующий код в файле рейка, который я буду запускать еженедельно.Нужна помощь по обновлению активной записи через рельсы

now = Date.today 
    Order.where(("status NOT IN ('Completed','Canceled','Shipped') AND DATE(updated_at) <= ?"),(now-30)).update_all("status = '*'",'Pending Requestor') 

Проблема в том, что это ошибка неправильного числа аргументов.

глядя на http://apidock.com/rails/ActiveRecord/Base/update_all/class

Я попытался

now = Date.today 
    Order.update_all("status = 'Pending Requester'",("status NOT IN ('Completed','Canceled','Shipped') AND DATE(updated_at) <= ?"),(now-30)) 

, но это дает мне 3 для одной ошибки.

Так что мне нужно сделать, так это найти все заказы, в которых статус не указан в этом списке, и последний раз, когда они были обновлены, превысили 30 дней назад и автоматически помещают их в статус ожидающего запроса.

Может кто-нибудь помочь мне с тем, что я ошибаюсь?

ответ

1

В вашем коде, что назначается переменной now? Я собираюсь предположить, что это Time.now.

Кроме того, все дополнительные скобки, которые вы добавили, не нужны. Я упростил ваш запрос ниже и написал его, чтобы его было легко понять.

Изменить код:

Order.where(
    "status NOT IN (?) AND updated_at <= ?",  # Simplifyied the query 
    %w(Completed Canceled Shipped),    # Can also be written as ['Completed', 'Canceled', 'Shipped'] 
    30.days.ago         # Self-explanatory 
).update_all(status: 'Pending Requestor') 

where принимает только 1 аргумент ПОКА аргумент не содержит знак вопроса (?). Для каждого вопросительного знака он получает дополнительный аргумент, чтобы заменить знак вопроса на значение.

Бонус: При работе со статусами в Rails я предлагаю изучить Enumerable convention. Это потрясающе!

Смежные вопросы