这个代码是有意义的英文:
post.created_at < 30.days.ago
你的大脑把它读成:
如果这个帖子被创建不到30天前...
但是,红宝石将其读为:
如果这个帖子被创建的日期小于(前)之日起30天前...
记住30.days.ago
返回datetime,而不是时间。假设post.created_at
是两周前的,即2016-01-06(实际上它是DateTime,但为了演示我们将忽略时间)。两周不到30天,所以你可能会期望你的表情评估为true
。但是,30.days.ago
返回日期2015-12-22。把这些值转换成我们的表达(现伪代码):
2016-01-06 < 2015-12-22
这个计算结果为false
,因为左边的日期是前不(阅读:不小于)右侧的日期。
为了测试post.created_at
是否是后(读:大于)30.days.ago
,我们必须扭转操作:
if post.created_at > 30.days.ago
附:另一种考虑的方式是30天前的日期是否在(小于)post.created_at
之前。这基本上(如果不完全)等同:
if post.created_at > (DateTime.now - 30.days)
或者你可以考虑post.created_at
是否30.days.ago
与今天:
if post.created_at.between?(30.days.ago, DateTime.now)
或者,由于post.created_at
经过的时间是否少于30天:
if (DateTime.now - post.created_at) < 30.days
(请注意,而30.days.ago
返回datetime,30.days
返回durati )
@MrYoshiji它没有改变任何东西。输出仍然是一样的。 –