0

私は車両を持っています、それぞれが多くの予約を持つことができます。各予約には多くのイベントを含めることができます。この質問は、既存の車両に対して新しい予約とイベントを検証するときに発生します。

イベントモデルを検証するときは、新しい予約とイベントを実際に保存する前に、車両までトラバースして、すべての予約と新しいものと衝突する可能性のあるイベントを見つける必要があります。

Class Event < ActiveRecord::Base
  belongs_to :eventable, :polymorphic => true
end

Class Booking < ActiveRecord::Base
  belongs_to :vehicle
  has_many :events, :as => :eventable
end

Class Vehicle < ActiveRecord::Base
  has_many :bookings
end

予約を作成するとき、それはVehicle_idを持っています。イベントモデル内でVehicle_idを取得するにはどうすればよいですか?

4

1 に答える 1

1

通常、validates_uniqueness_ofを:scopeとともに使用しますが、ここでの結合の関連付けはそのようには機能しません。カスタム一意性バリデーターの例を次に示します。

class Booking
  # Create a custom validation
  validate :verify_unique_vehicle_date

private
  def verify_unique_vehicle_date
    if booking = Booking.includes(:events).where('vehicle_id = ? AND events.date IN (?)', self.vehicle_id, self.events.map(&:date)).first
      errors.add(:vehicle, "already booked on #{booking.events.map(&:date).join(',')}")
    end
  end
end
于 2012-09-20T19:31:05.473 に答える