Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails实例变量基于时间?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails实例变量基于时间?

Ruby on rails Rails实例变量基于时间?,ruby-on-rails,ruby,Ruby On Rails,Ruby,快速提问。如果我有一个模型,比如慈善机构,它有一个start\u date和一个end\u date属性,我如何从控制器中的方法将其设置为当前慈善机构 我知道我必须做一些慈善活动。查找(params[:something]),只需将当前慈善机构设置为等于开始日期为当前日期,而谁的结束日期为快速回答:搜索结束日期为零的慈善机构 更详细的回答:您的数据模型可能与所需的语义不匹配。在我看来,开始日期在这里是无关紧要的——现在的慈善机构不是结束日期还没有发生的吗 通常,获取最新X的一种方法是获取所有X,

快速提问。如果我有一个模型,比如慈善机构,它有一个
start\u date
和一个
end\u date
属性,我如何从控制器中的方法将其设置为
当前慈善机构


我知道我必须做一些慈善活动。查找(params[:something]),只需将
当前慈善机构
设置为等于
开始日期
为当前日期,而谁的
结束日期
为快速回答:搜索
结束日期
为零的慈善机构

更详细的回答:您的数据模型可能与所需的语义不匹配。在我看来,
开始日期
在这里是无关紧要的——现在的慈善机构不是结束日期还没有发生的吗

通常,获取最新X的一种方法是获取所有X,按降序日期排序,然后获取第一个(或者在SQL术语中,使用LIMIT 1)。在ActiveRecord中,是这样的:

Charity.order("end_date DESC").first
虽然我对Rails 3 AR语法有点生疏,我认为该查询无法解决您的实际问题(尽管它看起来有点酷,amirite?)

另一种解决方案是反规范化——在保存前添加一个
current
布尔字段和一个
,该过滤器根据您描述的逻辑设置
self[:current]
。编辑:实际上,这在这里不起作用,因为时间在流逝,当前的内容将在单个模型的数据范围之外发生变化


我最好的建议是编写大量的单元测试!基于时间的逻辑非常复杂,很容易忽略边缘情况。

在模型中添加作用域方法:

def self.current
  now = Time.now
  where("start_date <= ? AND ? <= end_date", now, now).first
end

记住在数据库中为搜索中经常使用的列添加索引


通过添加db迁移来添加索引。

我更喜欢Thilo的答案。但是一定要写很多单元测试!基于时间的逻辑很复杂,很容易忽略边缘情况。您可以使用“模拟时钟”测试时间——在RSpec中,您可以执行类似于
time.stub的操作!(:now).和_return{Time.parse(“2010-01-01 12:00”)}
欺骗您的代码,使其认为这是不同的一天。
current_charity = Charity.current