无法重构代码rails 4查询

时间:2016-07-24 14:46:37

标签: ruby-on-rails postgresql ruby-on-rails-4

情节是,我希望获得2个案例的所有时间段。

  1. 如果门卫为真,则查询相同

  2. 如果门卫为假,则需要在查询中添加参数

  3. 因此,它的相同查询几乎可以适用于两种情况,几乎没有修改。

    以下是查询和代码:

    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方法的方式重构我的代码和查询。

    在这两种情况下,我都不想写两次这些查询。我需要使用代码实践的更好的解决方案。或者如果我这样做,你也可以提供建议。

    如果有人可以提供帮助,还需要良好的专业代码实践和代码重构。

2 个答案:

答案 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