基本底漆:

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/

10-09 08:37