我有以下哈希数组
[ { 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'}
感谢任何帮助。感谢
答案 0 :(得分:1)
这不起作用,因为:
strings
,而不是date
个对象==
),您需要使用(<=
&amp;&amp; >=
)所以,这是一个完整的示例,请注意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?
。
这就是工作:
[]