gpt4 book ai didi

ruby-on-rails - 干掉范围?

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:15 24 4
gpt4 key购买 nike

这里是 ruby 初学者。我定义了以下范围,我有一种强烈的感觉,我可以用更干燥的方式来做到这一点。关于如何以较少重复的方式执行此操作有什么想法吗?

scope :end_during, ->(new_start_time, new_end_time) do
if (!new_start_time.nil?) && (!new_end_time.nil?)
where('end_time > ? AND end_time < ?', new_start_time, new_end_time)
else
return nil
end
end

scope :start_during, ->(new_start_time, new_end_time) do
if (!new_start_time.nil?) && (!new_end_time.nil?)
where('start_time > ? AND start_time < ?', new_start_time, new_end_time)
else
return nil
end
end

scope :happening_during, ->(new_start_time, new_end_time) do
if (!new_start_time.nil?) && (!new_end_time.nil?)
where('start_time > ? AND end_time < ?', new_start_time, new_end_time)
else
return nil
end
end

scope :enveloping, ->(new_start_time, new_end_time) do
if (!new_start_time.nil?) && (!new_end_time.nil?)
where('start_time < ? AND end_time > ?', new_start_time, new_end_time)
else
return nil
end
end

scope :identical, ->(new_start_time, new_end_time) do
if (!new_start_time.nil?) && (!new_end_time.nil?)
where('start_time = ? AND end_time = ?', new_start_time, new_end_time)
else
return nil
end
end

它们是这样使用的:

def overlaps
overlapping_bookings = [
subject.bookings.end_during(start_time, end_time),
subject.bookings.start_during(start_time, end_time),
subject.bookings.happening_during(start_time, end_time),
subject.bookings.enveloping(start_time, end_time),
subject.bookings.identical(start_time, end_time)
].flatten

overlapping_bookings.delete self
if overlapping_bookings.any?
errors.add(:base, 'Slot has already been booked')
end
end

最佳答案

您可以将通用的东西分解到另一个作用域中,然后从您的各个作用域中使用正确的参数调用它:

scope :time_constraint, ->(c1, f1, c2, f2) do
return nil unless f1 && f2
where "%s ? AND %s ?" % [c1, c2], f1, f2
end

scope :end_during, ->(start_time, end_time) { time_constraint "end_time >", start_time, "end_time <", end_time }
scope :start_during, ->(start_time, end_time) { time_constraint "start_time >", start_time, "start_time <", end_time }
scope :happening_during, ->(start_time, end_time) { time_constraint "start_time >", start_time, "end_time <", end_time }
scope :enveloping, ->(start_time, end_time) { time_constraint "start_time <", start_time, "end_time >", end_time }
scope :enveloping, ->(start_time, end_time) { time_constraint "start_time =", start_time, "end_time =", end_time }

它读起来也不错。

关于ruby-on-rails - 干掉范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20864906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com