基本底漆:
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
所以问题是has-many方法
User.first.programs
似乎返回了一个类似于ActiveRecord::Relation
的结果,并接受了类似于Relation
的方法,但是它自己识别为Array
并与类Array
的实例共享其方法。那又有什么好处呢?
最佳答案
这确实令人惊讶,而且不知道它是否是最好的解决方案,但至少它被记录在案(在AssociationProxy类中):
blog.posts中的关联代理
在blog中的对象是@owner
作为@target的帖子集合,
@reflection对象表示
a:有很多宏。
这个班有很多基本的
实例方法已移除,并且
将未知方法委托给@target
缺少via方法作为一个角落,
它甚至删除了类方法和
所以你才会
blog.posts.class#=>数组
blog.posts后面的对象不是
数组,但是
activerecord::关联::hasmanyassociation。
关于ruby-on-rails - has_many关系的实际类是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5010089/