Почему в Ruby on Rails story.votes возвращает пустой объект Array, а story.votes.create фактически вызывает метод класса голосования? - PullRequest
1 голос
/ 23 мая 2010

В Ruby on Rails, скажем, объект Story может "has_many" голосовать за объекты (за историю проголосовали "горячие" многие пользователи).

Итак, когда мы делаем

s = Story.find(:first)

s - это сюжетный объект, и говорят

s.votes

возвращает [] и

s.votes.class

возвращает Array

Очевидно, что s.votes - это пустой объект Array.

В это время, когда

s.votes.create

называется, это на самом деле вызывает метод класса голосования? Почему объект класса Array может вызывать метод класса Vote?

Ответы [ 2 ]

4 голосов
/ 23 мая 2010

В вашем случае .votes - это , а не , возвращающее Array, оно возвращает специальный Association объект.

Причина, по которой он выглядит как Array, заключается в том, что объект ассоциации делегирует все свои методы, кроме динамических, таких как create, объекту массива, который он содержит внутри. И это означает, что когда вы вызываете .class для объекта, также делегируется объекту Array.

1 голос
/ 23 мая 2010

votes - это не массив, это метод объекта Story. Если вы вызываете его один, он возвращает массив всех Vote записей, связанных с этим Story. Причина, по которой вы получаете Array, когда вы делаете s.votes.class, заключается в том, что s.votes возвращает массив (который в данном случае пуст, потому что s не имеет голосов), и вы проверяете класс возвращаемого массива.

В свою очередь, s.votes.create - это еще один метод, динамически генерируемый Rails на основе ассоциаций вашей модели. Это не метод Array.

...