1

我有一个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变量expdateDate(我知道这是一种可怕的查找记录的方法,这更多是为了我自己的熏陶,也是一些测试代码。)

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

2 回答 2

1

当你给它一个 ID 来查找时,该find方法永远不会返回nil:如果它找不到你要查找的记录,它会引发ActiveRecord::RecordNotFound异常。所以,rec总是非nil而且rec.nil?总是假的。这意味着你的循环真的是这样的:

while rec.expdate < Date.today

如果你的循环总是返回recfrom#note1那么你根本就不会进入while循环,而且你总是MyModel在第一次尝试时得到一个理想的结果。

其他需要考虑的点:

  1. 有时东西会被删除,所以Model.count + 1不一定是最大 ID。
  2. find引发异常以指示失败,因此您需要rescue ActiveRecord::RecordNotFound而不是检查nil.
于 2012-12-21T00:17:17.563 回答
-1

您正在使用|哪个是布尔或。尝试使用or||

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

于 2012-12-21T00:01:12.787 回答