has_many关系的实际类是什么?

时间:2011-02-15 22:06:07

标签: ruby-on-rails ruby activerecord

基础入门:

class User 
  has_many :programs, :through => :memberships
  has_many :memberships
end

class Program
end

class Membership
  belongs_to :user
  belongs_to :program
end

控制台:

User.new.save
Program.new.save
User.programs << Program.first

User.first.programs.class
# => Array
User.first.programs.methods.grep /where/
# => []
User.first.programs.where :id => 1
# => [#<Program id: 1>]
User.first.programs.where(:id => 1).class
# => ActiveRecord::Relation

所以问题是,User.first.programs,has_many方法,似乎返回一个像ActiveRecord::Relation一样的结果并接受像Relation这样的方法,但是自我标识为{ {1}}并使用类Array的实例共享其方法。

那是什么给了什么?

1 个答案:

答案 0 :(得分:4)

这确实令人惊讶,并且不知道它是否是最佳解决方案,但至少它已被记录(在AssociationProxy类中):

  

blog.posts中的关联代理   在博客中有@owner的对象   收集其帖子为@target,   和@reflection对象代表   a:has_many宏。

     

这个班有大部分基础   删除了实例方法,以及   将未知方法委托给@target   通过method_missing。作为一个角落案例,   它甚至删除了类方法和   这就是你得到的原因

     

blog.posts.class#=&gt;数组虽然   blog.posts背后的对象不是   数组,但是   ActiveRecord的::协会:: HasManyAssociation。