ActiveRecord在说谎吗?

时间:2012-07-09 13:37:59

标签: ruby-on-rails activerecord

我的ActiveRecord并没有说实话。亲眼看看:

> User.posts.class
  => Array
> User.posts.all.class
  => Array
> a = Array.new
> a.class
 => Array 
> a.all
  NoMethodError: undefined method `all' for []:Array

没有Array#all方法,因此User.posts不能是Array。这是怎么回事?

2 个答案:

答案 0 :(得分:4)

这是在rails中实现关联的方式。它们是懒惰的代理对象。

请查看有关此内容的更多信息的文档:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_proxy.rb#L25

答案 1 :(得分:1)

Ruby有一个单例方法的概念。这意味着对象可以更改其类定义的行为。阅读this