Установка лимита для записи записей - PullRequest
0 голосов
/ 02 марта 2019

У меня есть следующее:

after_action :prevent_order_create, :only => [:update, :create]
...
private

def prevent_order_create
      @order = Order.find(params[:id]) #line 270
      @listing = Order.find_by(params[:listing_id])

      @order_seller = @order.where(order_status: [1]).where(:seller)

      if @order_seller.count >= 0
        @listing.update_column(:listing_status, 3)
      end

end

Цель - ограничить количество заказов, которые могут быть открыты для любого 1 продавца.

Когда я использую этот код, я получаю следующую ошибку:

ActiveRecord::RecordNotFound (Couldn't find Order without an ID):

app/controllers/orders_controller.rb:270:in `prevent_order_create'

Заказ создается, но по какой-либо причине эта проблема возникает.Разве метод не должен проверяться ПОСЛЕ того, как заказ сделан без проблем?

кстати, используя 0 для целей тестирования.

РЕДАКТИРОВАТЬ:

Я сделал:

def prevent_order_create
  @order_seller = Order.where(order_status: [1]).where(listing_id: Listing.ids)

  if @order_seller.count >= 10
    @listing.update_column(:listing_status, 3)
  end

end

Кажется, сейчас работает.Буду обновлять.

1 Ответ

0 голосов
/ 02 марта 2019

Все, что вы описываете, соответствует ожиданиям.

После действия выполняется после того, как действие уже выполнено, поэтому запись уже сохранена в вашей БД к моменту возникновения исключения.

Исключение вызвано тем, что params[:id] - это nil, что имеет смысл для действия создания.

Обновление после уточнения в комментарии

OP говорит:

Я хочу после создания и обновления ... найти любые заказы с совпадающими :listing_id и order_status из [1], чтобы затем посчитать эти записи.Если счет>> 1000, чтобы затем изменить list_status Листинга

Я думаю, что я бы сделал это в after_save в модели Order.Основываясь на вашем последнем редактировании, что-то вроде:

scope :status_one, -> { where order_status: 1 }  # I'm guessing this should be 1 not [1] as you keep putting
after_save :update_listing

def update_listing
  if listing.orders.status_one.count >= 10
    listing.update! listing_status: 3
  end
end

Таким образом, это в основном говорит о том, что если в связанном листинге 10 или более связанных ордеров с order_status = 1, тогда установите его статус равным 3.

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