【问题标题】:Get attribute of polymorphic parent before save, in Rails 3?在Rails 3中保存之前获取多态父级的属性?
【发布时间】:2012-09-21 04:35:47
【问题描述】:

我有车辆,每辆可以有很多预订。每个预订可以有许多事件。当我针对现有车辆验证新的预订和活动时,就会出现这个问题。

在验证 Event 模型时,我需要遍历 Vehicle 并找到所有 Bookings 和任何可能与新的 Bookings 冲突的 Event,然后才真正保存新的 Bookings 和 Event。

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

在创建 Booking 时,它具有 vehicle_id。如何在 Event 模型中获取 vehicle_id?

【问题讨论】:

    标签: ruby-on-rails ruby polymorphism


    【解决方案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
    

    【讨论】:

    • 谢谢@Winfield 这已经解决了,而且是一个更好的方法。我被复数 validate 和单数 include 迷住了一会儿。
    • 感谢您这么快给出答案!有什么想法可以让我检查日期范围吗?我有events.start_atevents.end_at。如果活动在同一天,您当前提供的内容有效。
    • 哎呀,您必须检查所有冲突的日期范围。那将是丑陋的。您需要为当前预订中的每个事件生成 ((? between event.starts_at AND event.ends_at) OR (? between event.starts_at AND event.ends_at)), my_event.starts_at, my_event.ends_at :-C跨度>
    • 完全正确!还需要事件是否与现有事件重叠的条件。我有"(start_at &gt;= ? and start_at &lt; ?) OR (end_at &gt; ? and end_at &lt;= ?) OR (start_at &lt; ? and end_at &gt; ?)", from, to, from, to, from, to - 这有点脏。我现在正在改进。
    • 我使用德摩根定律得到了它的工作结果if booking = Booking.includes(:events).where('vehicle_id = ?', self.vehicle_id).where('NOT(? &gt; events.end_at OR ? &lt; events.start_at)', self.events.map(&amp;:start_at), self.events.map(&amp;:end_at)).first
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2020-05-10
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多