根据日期范围从散列数组返回数据

时间:2018-01-19 16:27:12

标签: ruby ruby-on-rails-4

我有以下哈希数组

[ { a: 1, b: 1, c: 1, start_date: '2017-01-01', end_date: '2017-02-01'},
{ a: 1, b: 2, c: 1, start_date: '2017-03-01', end_date: '2017-04-01'},
{ a: 2, b: 3, c: 3, start_date: '2017-05-01', end_date: '2017-06-01'},
{ a: 4, b: 4, c: 4, start_date: '2017-07-01', end_date: '2017-08-01'},
{ a: 4, b: 5, c: 5, start_date: '2017-09-01', end_date: '2017-12-01'} ]

我正在尝试获取基于散列的start_date和end_date列表。我尝试像下面那样实现它,但它返回[]

params[:start_date] = '2017-01-01'
params[:end_date] = '2017-06-01'

array.select {|e| e[:start_date] == params[:start_date] && e[:end_date] == params[:end_date] }

所以基于start_date和end_date输入,它应该从数组返回前3个哈希

{ a: 1, b: 1, c: 1, start_date: '2017-01-01', end_date: '2017-02-01'},
{ a: 1, b: 2, c: 1, start_date: '2017-03-01', end_date: '2017-04-01'},
{ a: 2, b: 3, c: 3, start_date: '2017-05-01', end_date: '2017-06-01'}

感谢任何帮助。感谢

3 个答案:

答案 0 :(得分:1)

这不起作用,因为:

  1. 您使用的是strings,而不是date个对象
  2. 您正在严格比较范围(==),您需要使用(<=&amp;&amp; >=
  3. 所以,这是一个完整的示例,请注意Date.parse<= >=

    require 'date'
    
    params[:start_date] = '2017-01-01'
    params[:end_date] = '2017-06-01'
    
    array.select {|e| Date.parse(e[:start_date]) >= Date.parse(params[:start_date]) && Date.parse(e[:end_date]) <= Date.parse(params[:end_date]) }
    

    https://ruby-doc.org/stdlib-2.4.1/libdoc/date/rdoc/Date.html#method-c-parse

    更新正如Cary Swoveland指出的那样,Date.parse没有必要,但我认为这是验证字符串的好方法,特别是如果它来自params。

答案 1 :(得分:0)

出于好奇:

▶ allowed = Range.new(*[params[:start_date], params[:end_date]].
▷   map(&Date.method(:parse)))
▶ input.select do |h|
▷   [h[:start_date], h[:end_date]].
▷     map(&Date.method(:parse)).all? &allowed.method(:cover?)
▷ end

答案 2 :(得分:0)

使用字符串而不是日期对象不是问题。问题是您正在选择数组的元素,其开始日期恰好等于<form action="" method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ form }} </form> 且其结束日期完全等于params[:start_date]。因为没有任何一个,你得到params[:end_date]作为回应。

没有理由解析日期。 Ruby很乐意比较字符串,只要它们采用您提供的格式,结果就是正确的。但是你需要使用比较运算符,或者更好的是,使用专为此目的而设计的Comparable#between?

这就是工作:

[]