0

レコード(予約)のステータスが変更されたときにいくつかのレコード(チケット)を作成するオブザーバーがいます。アプリケーションの実行時に問題なく動作します。ただし、移行中または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

私が見つけたすべての投稿で、人々はオブザーバーを無効にしようとしていました。まあ、私の場合は逆です

4

1 に答える 1

1

環境ごとにオブザーバーを有効にする必要があることがわかりました。この3つのファイル

config/enviroments/development.rb
config/enviroments/test.rb
config/enviroments/production.rb

常に実行されているオブザーバーをアクティブにする必要があります。

config.active_record.observers = :booking_observer
于 2012-08-16T05:24:36.250 に答える