Ruby on Rails: has_many referential -- какими объектами модели он владеет?

Я новичок в Rails и закончил "Ruby on Rails 3 Tutorial" Майкла Хартла. Хотя книга многому меня учит, я не понимаю эту загадку.

Чтобы просмотреть головоломку, то есть я не понимаю, внутри модели пользователя,

has_many :following, :through=>:relationship, :source=>:followed

как этот фрагмент кода связывает «user.following» с массивом экземпляров User.

А ниже вся загадка.

Во-первых, у меня есть модель Relationship, которая записывает информацию followed_id и follower_id. Внутри модели Relationship ассоциация проста как

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

  belongs_to :follower, :class_name => "User"
  belongs_to :followed, :class_name => "User"
end

Затем в модели пользователя пользователь возьмет на себя роль последователя и соберет все свои последующие строки в таблице отношений через ассоциацию relationships.

class User < ActiveRecord::Base
  .
  .
  .
  has_many :relationships, :foreign_key => "follower_id", :dependent => :destroy
  .

До сих пор я получил это.

Но путаница возникла на следующей строке, где через user.following он может собрать все подписки этого пользователя (экземпляры пользователя). Вот так,

has_many :following, :through=>:relationships, :source=>:followed

Я понимаю, что :source=>:followed перезапишет значение по умолчанию и позволит найти все followed_id, связанные с этим пользователем.

Но как Rails может распознать followed_id для ссылки на объект User? Имя метки не соответствует users и не указано :class_name. Я просто не понимаю, как Rails выполняет эту базовую работу, или я упустил некоторые подсказки.

Спасибо! :)


person Leo    schedule 30.08.2011    source источник


Ответы (2)


Но как Rails может распознать follow_id для ссылки на объект User? Имя метки не соответствует пользователям, и не указано :class_name. Я просто не понимаю, как Rails выполняет эту базовую работу, или я упустил некоторые подсказки.

Rails распознает, что это пользовательский объект, потому что он установлен в свойстве own_to отношения. Здесь Rails следует за классом отношений через внешний ключ «follower_id» и возвращает каждого пользователя, который имеет отношения с текущим пользователем, как следует. Конечно, Rails делает это с помощью одного оператора SQL, например:

SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `relationships`.followed_id = `users`.id WHERE ((`relationships`.follower_id = <the current user id>  ))
person cicloon    schedule 30.08.2011
comment
Могу ли я интерпретировать, что ассоциация с моделью отношений через belongs_to успешна, потому что у пользователя есть :source=>:followed, а отношения также определяют belongs_to :followed? - person Leo; 30.08.2011
comment
Именно поэтому rails знает, что это User. - person cicloon; 30.08.2011

has_many :following, :through=>:relationships, :source=>:followed

Это объясняет Rails, что following является обратным отношением following и что у пользователей есть много последователей и следящих за его отношениями.

Способ, которым Rails знает, что followed_id связан с пользователем, заключается в том, что он определен в вашей модели Relationship.

Надеюсь, вы поняли! Удачи :)

person Cydonia7    schedule 30.08.2011