基础入门:
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
的实例共享其方法。
那是什么给了什么?
答案 0 :(得分:4)
这确实令人惊讶,并且不知道它是否是最佳解决方案,但至少它已被记录(在AssociationProxy类中):
blog.posts中的关联代理 在博客中有@owner的对象 收集其帖子为@target, 和@reflection对象代表 a:has_many宏。
这个班有大部分基础 删除了实例方法,以及 将未知方法委托给@target 通过method_missing。作为一个角落案例, 它甚至删除了类方法和 这就是你得到的原因
blog.posts.class#=&gt;数组虽然 blog.posts背后的对象不是 数组,但是 ActiveRecord的::协会:: HasManyAssociation。