Каков фактический класс отношения has_many? - PullRequest
1 голос
/ 16 февраля 2011

Основной праймер:

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, но идентифицирует себя как Array и разделяет его методы с экземпляром класса Array.

Так что же дает?

1 Ответ

4 голосов
/ 16 февраля 2011

Это действительно удивительно, и я не знаю, было ли это лучшим решением, но, по крайней мере, оно задокументировано (в классе AssociationProxy ):

прокси ассоциации в blog.posts имеет объект в блоге как @owner, коллекция его постов как @target, и объект @reflection представляет a: макрос has_many.

Этот класс имеет большинство основных методы экземпляра удалены, и делегирует неизвестные методы @target через method_missing. В качестве углового случая, он даже удаляет метод класса и вот почему вы получаете

blog.posts.class # => Массив объект позади blog.posts не является Массив, но ActiveRecord :: Ассоциации :: HasManyAssociation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...