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