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