具有for循环的ruby方法,意外返回

时间:2012-12-20 23:34:33

标签: ruby ruby-on-rails-3

我有一个模型MyModel,其中包含一个返回特定记录的方法(参见下面的逻辑)。

def self.find_future_rec   #note2
  rec = find(rand(MyModel.count)+1)   #note1
  while rec.nil? | (rec.expdate<Date.today)
    rec = find(rand(MyModel.count)+1)
  end
  return rec
end

MyModel类的每个记录都有一个expdate类的变量Date。 (我知道这是一种找到记录的可怕方式,这更适合我自己的启发和一些测试代码。)

  1. 此方法将在找到适当的记录之前迭代几个不需要的记录,但返回的记录始终是在note 1找到的记录,即查询的第一个记录。这里有一些懒惰的任务吗?
  2. 我必须在self添加note2才能在静态上下文中调用该方法。这是正确的解释吗?

2 个答案:

答案 0 :(得分:1)

当您为其找到一个ID时,find方法永远不会返回nil:如果找不到您要求的记录,则会引发ActiveRecord::RecordNotFound异常。因此,rec始终为非nilrec.nil?始终为false。这意味着你的循环真的是这样的:

while rec.expdate < Date.today

如果您的循环总是从rec返回#note1,那么您根本就不会进入while循环,而且您总是会得到理想的MyModel第一次尝试。

需要考虑的其他要点:

  1. 有时会删除内容,因此Model.count + 1不一定是最大ID。
  2. find会引发异常以指示失败,因此您需要rescue ActiveRecord::RecordNotFound而不是检查nil

答案 1 :(得分:-1)

您正在使用|这是一个布尔OR。尝试使用or||

添加self以使方法成为类方法(“静态”是一个不错的近似值)确实是解决此问题的正确方法之一。