情节是,我希望获得2个案例的所有时间段。
如果门卫为真,则查询相同
如果门卫为假,则需要在查询中添加参数
因此,它的相同查询几乎可以适用于两种情况,几乎没有修改。
以下是查询和代码:
def self.latest_pickup_date current_zone,doorman
if doorman
latest_timeslot = Timeslot.where(dropoff_slots: '-1', zone_id: current_zone).order(:slot_date).last
else
latest_timeslot = Timeslot.where(dropoff_slots: '-1', zone_id: current_zone, doorman_type: "none").order(:slot_date).last
end
latest_timeslot.nil? ? Date.current : latest_timeslot.slot_date
end
我想以一种使用DRY方法的方式重构我的代码和查询。
在这两种情况下,我都不想写两次这些查询。我需要使用代码实践的更好的解决方案。或者如果我这样做,你也可以提供建议。
如果有人可以提供帮助,还需要良好的专业代码实践和代码重构。
答案 0 :(得分:2)
您可以对现有查询执行where
,添加其他条件,并在查询为空时使用try
def self.latest_pickup_date current_zone,doormam
latest_timeslot = Timeslot.where(dropoff_slots: '-1', zone_id: current_zone).order(:slot_date)
latest_timeslot = latest_timeslot.where(doorman_type: 'none') unless doorman
latest_timeslot.last.try(:slot_date) || Date.current
end
答案 1 :(得分:1)
请您查看以下重构代码,如果您喜欢这种方法,请告诉我。
def self.latest_pickup_date current_zone,doorman
filters = {dropoff_slots: '-1', zone_id: current_zone}
filters[:doorman_type] = "none" unless doorman
latest_timeslot = Timeslot.where(filters).order(:slot_date).last
latest_timeslot.nil? ? Date.current : latest_timeslot.slot_date
end