新手问题 类方法可以这么用?

xiaoronglv · 2012年09月08日 · 最后由 blueplanet 回复于 2012年09月15日 · 2535 次阅读

http://railscasts.com/episodes/4-move-find-into-model?view=asciicast

@project.tasks应该是个数组吧?

@task = @project.tasks.find_incomplete

find_incomplete 是个类方法,不能这么用吧?

看了一下,貌似确实有问题啊

@project.tasks应该是 task 的数组吧,应该是不能用find_incomplete方法的

挖坟啊,那个时候的 association 返回的是啥?现在都用 scope 了,别纠结了。

#2 楼 @doitian 瞎说,现在都不用 scope 了,改写类方法了

以后别随便说类方法,容易误解,你那个 find_incomplete 是怎么定义的,是不是类似这样:

class Task < ActiveRecord::Base
  scope :find_incomplete, ......
end

#4 楼 @fsword

class Task < ActiveRecord::Base
  def self.find_incomplete
   ......
  end
end

#5 楼 @xiaoronglv 这个怎么会被看作“类方法”呢?而且真要这么写的话@task = @project.tasks.find_incomplete会失败的吧

@blueplanet @fsword find_incomplete 不会出错的啊 @project.tasks 在控制台下确实是数组 但实际上是 Relation .tasks .find_incomplete 调用的都是 sql 语句,至于为什么可以连用,是因为返回的是 AR::Relation,scope 能够连续调用(chaining)和 lazy evaluation 都是因为 AR::Relation 的原因 前不久看过一篇 ROR 的博客写的就是 activerecord 3 的改进,现在我记不得地址了,不过到 speakerdeck.com 去搜 activerecord 可以找到这方面的资料,为了确定我所说的我也建了 demo 试了一下。

@blueplanet self.find_incomplete 确实是类方法,但是重点是在方法里面的代码啊 Rails c 下,Task.find_incomplete 也是可以调用的

#6 楼 @fsword sorry,原代码中有 self,我漏了。。。。

冏。 已经修改了帖子。 灰常抱歉。

#7 楼 @dfang 原来如此。我只是单独写了个类跑了一下,场景完全不对啊。应该继承ActiveRecord跑一下的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号