2015-09-05 53 views
1

我想创建一个函数,如果未设置日期参数将返回默认值。如果参数不存在提供默认值

如果PARAMS [:START_TIME]不present?返回DateTime.now如果PARAMS [:END_TIME]不present?返回1.week.from_now

我想保持这两项检查的一个功能,但我不能让它工作。如果有更好的方法?

# Main search function 
    def self.search params, location 
    self 
    .join.not_booked 
    .close_to(Venue.close_to(location)) 
    .activity(Activity.get_ids params[:activity]) 
    .start_date(valid_date params[:start_time]) 
    .endg_date(valid_date params[:end_time]) 
    .ordered 
    end 

    # Check if date is nil 
    def self.valid_date date 
    if date 
     date.to_datetime 
    elsif date == params[:start_time] 
     DateTime.now 
    elsif date == params[:end_time] 
     1.week.from_now 
    end 
    end 

问另一种方式:

什么是这两个功能结合起来的最佳方式?

# Check if date is nil 
    def self.check_start date 
    date.present? ? date.to_datetime : DateTime.now 
    end 

    def self.check_end date 
    date.present? ? date.to_datetime : 1.week.from_now 
    end 

回答

1

如果它不是一个硬性要求,这两个方法结合起来,就可以简单方便地对检查start_time有效性和end_time这两种不同的方法:

def self.validate_start_date start_date 
    start_date.present? ? start_date.to_datetime : DateTime.now 
    end 

    def self.validate_end_date end_date 
    end_date.present? ? end_date.to_datetime : 1.week.from_now 
    end 

然后,在你的主搜索功能,因此使用它们(start_date(validate_start_date params[:start_time])end_date(validate_end_date params[:end_time])):

# Main search function 
    def self.search params, location 
    self 
     .join.not_booked 
     .close_to(Venue.close_to(location)) 
     .activity(Activity.get_ids params[:activity]) 
     .start_date(validate_start_date params[:start_time]) 
     .end_date(validate_end_date params[:end_time]) 
     .ordered 
    end 
+0

这不是一个硬性要求。我可能会这样做,继续前进。 – Batman

+0

这样,它比在一个单独的方法中对这些if/else变得更加简单和干净。恕我直言。 –

+1

是的,我只是要去那个。谢谢。 – Batman

0

也许我误解,但是为什么没有:

def self.check param 
    result = 1.week.from_now 
    if param[:end_time].present? 
     result = param[:end_time].to_datetime 
    end 
    return result 
end 

你的第二个“END_TIME”检查将始终覆盖任何可能的结果从“START_TIME”如果我们把它变成一个功能。

+0

这似乎更多的工作,然后上述解决方案 – Batman

+1

@Batman这并不能真正解决您的问题。它只是用来说明在单个函数中实现所需的功能是不可行的。除非你想返回多个对象并在之后分配。 –

+0

我明白了,很高兴知道。我最终使用了2个函数。这很简单。谢谢。 – Batman