レコード(予約)のステータスが変更されたときにいくつかのレコード(チケット)を作成するオブザーバーがいます。アプリケーションの実行時に問題なく動作します。ただし、移行中またはRailsコンソールでは実行されません。そして私が理解できるので、それはすべきです
これはapplication.rbにあります
# Activate observers that should always be running.
config.active_record.observers = :booking_observer
これがオブザーバーです(booking_observer.rb)
コーディング:utf-8
class BookingObserver < ActiveRecord::Observer
require 'logger'
def create_ticket(booking, passenger, leg)
ticket = Ticket.factory(booking, passenger, leg)
begin
ticket.save!
rescue Exception => e
booking.logger.error "Can't save #{leg} ticket: #{e}"
end
end
def after_update(booking)
if booking.changed? && booking.changed_attributes()["status"]!=Booking::CONFIRMED && booking.status==Booking::CONFIRMED.to_sym
passengers = booking.passengers.all
passengers.each do |passenger|
booking.logger.error "Passenger: #{passenger}"
create_ticket(booking, passenger, Booking::DEPARTURE_LEG)
create_ticket(booking, passenger, Booking::RETURN_LEG) if booking.booking_type.to_sym != :ow
end
end
end
end
これが移行のサンプルです
class CreateTicketsForValidBookings < ActiveRecord::Migration
def up
bookings = Booking.where("departure_date < ?", 1.minute.ago).where(status: "confirmed")
bookings.each do |booking|
booking.status="migrating"
booking.save
booking.status="confirmed"
booking.save
end
end
def down
bookings = Booking.where("departure_date < ?", 1.minute.ago).where(status: "migrating")
bookings.each do |booking|
booking.status="confirmed"
booking.save
end
end
end
私が見つけたすべての投稿で、人々はオブザーバーを無効にしようとしていました。まあ、私の場合は逆です