Rails实例变量基于时间?

时间:2011-10-02 18:21:58

标签: ruby-on-rails ruby

快速提问。如果我有一个具有start_dateend_date属性的模型,例如慈善机构,如何将其设置为来自Controller中方法的current_charity

我知道我必须做某种Charities.find(params[:something]),并且必须将current_charity设置为等于start_date> =当前日期的那个,并且谁end_date是< =当前日期(一次只有一个“当前”)。我通常只是通过参数[:id]找到一个模型,所以这对我来说是新的。

谢谢!

3 个答案:

答案 0 :(得分:5)

在模型中添加范围方法:

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

然后在你的控制器中:

current_charity = Charity.current

答案 1 :(得分:1)

快速回答:搜索end_date为零的慈善机构。

更长的答案:您的数据模型可能与您所需的语义不符。在我看来,start_date在这里是无关紧要的 - 目前的慈善机构不是end_date尚未发生的人吗?

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

Charity.order("end_date DESC").first

虽然我的Rails 3 AR语法有点生疏,但我不认为查询会解决你的实际问题(尽管看起来确实很酷,很棒吗?)。

另一种解决方案是反规范化 - 添加current布尔字段和before_save过滤器,根据您描述的逻辑设置self[:current]。编辑:实际上,这不会在这里起作用,因为时间已经过去了,当前的变化将超出单个模型数据的范围。

我最好的建议是写很多单元测试!基于时间的逻辑非常棘手,很容易错过边缘情况。

答案 2 :(得分:0)

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

通过添加数据库迁移来添加索引。