Ruby 猴子补丁日期类的最佳选择?

Ruby 猴子补丁日期类的最佳选择?,ruby,date,model,monkeypatching,Ruby,Date,Model,Monkeypatching,在我的应用程序中,我想在输入和查看时都支持一个空白日期字段,意思是“未来的某个不确定日期”。由于我将其存储在数据库中,并且在任何非nil日期之前进行nil排序,因此我决定对date类进行猴子补丁,以实现一个“max_value”方法,该方法返回“1/1/10000”(我选择的日期表示未来的不确定日期)。我一直在重载+、-、tos和其他运算符/方法,以便使用此值进行适当的操作。然后,我在模型中添加了一个before_save回调,以将任何空白日期转换为Date.max_值。这一切似乎都是可行的(除

在我的应用程序中,我想在输入和查看时都支持一个空白日期字段,意思是“未来的某个不确定日期”。由于我将其存储在数据库中,并且在任何非nil日期之前进行nil排序,因此我决定对date类进行猴子补丁,以实现一个“max_value”方法,该方法返回“1/1/10000”(我选择的日期表示未来的不确定日期)。我一直在重载+、-、tos和其他运算符/方法,以便使用此值进行适当的操作。然后,我在模型中添加了一个before_save回调,以将任何空白日期转换为Date.max_值。这一切似乎都是可行的(除了我正在尝试解决的一些bug),但是有没有更好的方法来做到这一点而不必对类进行猴子补丁?

您要查找的值为空。重写基类,比如Date,就是在自找麻烦

在查询中执行此操作

SELECT * FROM Mystery_Events ORDER BY ISNULL(some_event_date,'1/1/10000') ASC
或者,您可以使用

ORDER BY (case WHEN some_event_date IS NULL THEN 1 ELSE 0 END), some_event_date, some_other_sorting_field_to_give_order_to_the_nulls ASC

您要查找的值为空。重写基类,比如Date,就是在自找麻烦

在查询中执行此操作

SELECT * FROM Mystery_Events ORDER BY ISNULL(some_event_date,'1/1/10000') ASC
或者,您可以使用

ORDER BY (case WHEN some_event_date IS NULL THEN 1 ELSE 0 END), some_event_date, some_other_sorting_field_to_give_order_to_the_nulls ASC

谢谢你的回答,我一点也不反对你。我在试着打补丁时被咬了好几次,最后我打到了一个我不知道怎么走的地方。我知道这是个坏主意,这就是为什么我问这个问题,听一些其他的方法。然而,总体来说,这是一次很有启发性的经历。然而,我确实在昨天和明天的方法中留下了几次。我发现他们似乎在一天的晚些时候生成了错误的值--我怀疑这是时区问题,比如他们生成的是UTC值而不是本地值。我一直认为昨天/明天只是+/-24小时的简写。。。这不是真的吗?@colinross我相信你是对的,但我认为翻译过程中丢失了一些东西,他们以UTC而不是本地时间返回日期,这使得晚上(偏移8小时)的日期不正确。@Jack R-G,如果这些方法在默默地转换时区,听起来像是个错误。您应该在ruby core邮件列表中介绍一个主题,其中包含一个恶作剧行为的示例。。。我认为方法不应该隐含地改变时区……谢谢你的回答,我一点也不反对你。我在试着打补丁时被咬了好几次,最后我打到了一个我不知道怎么走的地方。我知道这是个坏主意,这就是为什么我问这个问题,听一些其他的方法。然而,总体来说,这是一次很有启发性的经历。然而,我确实在昨天和明天的方法中留下了几次。我发现他们似乎在一天的晚些时候生成了错误的值--我怀疑这是时区问题,比如他们生成的是UTC值而不是本地值。我一直认为昨天/明天只是+/-24小时的简写。。。这不是真的吗?@colinross我相信你是对的,但我认为翻译过程中丢失了一些东西,他们以UTC而不是本地时间返回日期,这使得晚上(偏移8小时)的日期不正确。@Jack R-G,如果这些方法在默默地转换时区,听起来像是个错误。您应该在ruby core邮件列表中介绍一个主题,其中包含一个恶作剧行为的示例。。。我认为方法不应该隐含地改变时区。。。