我有一个模型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
。 (我知道这是一种找到记录的可怕方式,这更适合我自己的启发和一些测试代码。)
note 1
找到的记录,即查询的第一个记录。这里有一些懒惰的任务吗?self
添加note2
才能在静态上下文中调用该方法。这是正确的解释吗?答案 0 :(得分:1)
当您为其找到一个ID时,find
方法永远不会返回nil
:如果找不到您要求的记录,则会引发ActiveRecord::RecordNotFound
异常。因此,rec
始终为非nil
,rec.nil?
始终为false。这意味着你的循环真的是这样的:
while rec.expdate < Date.today
如果您的循环总是从rec
返回#note1
,那么您根本就不会进入while
循环,而且您总是会得到理想的MyModel
第一次尝试。
需要考虑的其他要点:
Model.count + 1
不一定是最大ID。find
会引发异常以指示失败,因此您需要rescue ActiveRecord::RecordNotFound
而不是检查nil
。答案 1 :(得分:-1)
您正在使用|
这是一个布尔OR。尝试使用or
或||
。
添加self
以使方法成为类方法(“静态”是一个不错的近似值)确实是解决此问题的正确方法之一。