Ruby on rails 检查“唯一验证”以确保更具可读性和更强大

Ruby on rails 检查“唯一验证”以确保更具可读性和更强大,ruby-on-rails,Ruby On Rails,我需要确保每个日期只能有一个房间sku的房间 这是我的逻辑 如果一天没有房间的SKU=>确定 如果一个房间一天只有一个SKU,那么检查SKU是否等于它本身。 如果是,则=>确定 如果没有=>失败 我只是觉得我的逻辑不是很强,很难理解 我打赌有一个很好的解决方案来解决RoR问题 class RoomSku < ActiveRecord::Base belongs_to :room validate :should_be_unique_in_one_day def should_

我需要确保每个日期只能有一个房间sku的房间

这是我的逻辑

如果一天没有房间的SKU=>确定 如果一个房间一天只有一个SKU,那么检查SKU是否等于它本身。 如果是,则=>确定 如果没有=>失败

我只是觉得我的逻辑不是很强,很难理解

我打赌有一个很好的解决方案来解决RoR问题

class RoomSku < ActiveRecord::Base
  belongs_to :room
  validate :should_be_unique_in_one_day

  def should_be_unique_in_one_day
    skus_on_this_day = _get_skus_on_this_day
    if skus_on_this_day.count==0
        nil
    elsif skus_on_this_day.count==1 and skus_on_this_day.first.id = self.id
        nil
    else
        errors.add(:departure_at, I18n.t("already_exists_on_the_same_day"))
    end
  end

  def _get_skus_on_this_day
    self.class.where(room_id: self.room_id, date: self.date)
  end
end
class-RoomSku
我相信您正在寻找的是范围唯一性验证

validates :date, uniqueness: { scope: :room_id }
或者,如果必须将该错误应用于位于的出发点,则可以执行以下操作:

def should_be_unique_in_one_day
  errors.add(:departure_at, I18n.t("already_exists_on_the_same_day")) if RoomSku.where(room_id: room_id, date: date).where.not(id: id).exists?
end

我相信您正在寻找的是范围唯一性验证

validates :date, uniqueness: { scope: :room_id }
或者,如果必须将该错误应用于位于的出发点,则可以执行以下操作:

def should_be_unique_in_one_day
  errors.add(:departure_at, I18n.t("already_exists_on_the_same_day")) if RoomSku.where(room_id: room_id, date: date).where.not(id: id).exists?
end