проверьте, есть ли у родительской записи дочерние записи с start_date в будущем, затем прекратите обновление rails - PullRequest
1 голос
/ 12 июня 2019

У меня есть таблица с именем items, и у меня есть метод с именем archive в items_controller.rb, если метод вызывается, он устанавливает активное поле элемента в значение false. проблема в том, что у меня есть другая таблица с именем reservations и поле для нее с именем start_date, поэтому я хочу, прежде чем обновить активное поле элемента на false, я хочу проверить, есть ли в будущем какие-либо резервирования с полем start_date. если есть, не обновляйте активное поле элемента и не сообщайте пользователю об ошибке.

вот item.rb

class Item < ApplicationRecord
 has_many :reservations
 before_save :check_for_reservations
 def check_for_reservations
   if reservations.count > 0
     reservations.each do |reservation|
       if reservation.start_date > Date.today
       return false
      end
     end
   end
 end
end

вот items.controller.rb

 def archive
 @item = Item.find(params[:id])
 @item.active = false

 if @item.save
    flash[:notice] = "Item been archived..."
 else
    flash[:alert] = "Something went wrong..."
 end
   redirect_back(fallback_location: request.referer)
 end

не работает при обновлении записи элемента активный равный = ложь

1 Ответ

2 голосов
/ 12 июня 2019

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

class Item < ApplicationRecord
  has_many :reservations
  before_save :check_for_reservations

  validate :okay_to_archive

  def okay_to_archive
    if !item.active && reservations.where("start_date >= ?", Date.today).any? 
      errors.add(:active, "can't be set to false when there are future reservations")
    end
  end

end

!item.active проверяет, является ли атрибут active не true (nil или false). И reservations.where("start_date >= ?", Date.today).any? проверяет, есть ли какие-либо ассоциированные reservations, которые имеют start_date, который приходит после сегодняшнего дня. Итак, вместе:

if !item.active && reservations.where("start_date >= ?", Date.today).any? 
  ...
end

они проверяют, является ли item неактивным с будущими бронированиями. Если это так, то ошибка записывается в errors:

errors.add(:active, "can't be set to false when there are future reservations")

и при попытке сделать @item.save вы получите ошибку проверки.

def archive
  @item = Item.find(params[:id])
  @item.active = false

  if @item.save
    flash[:notice] = "Item been archived..."
  else
    flash[:alert] = "Something went wrong..."
  end
  redirect_back(fallback_location: request.referer)
end

Код не проверен, но должен быть закрыт.

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