Подтвердить что ты не робот

Rails: разница между: source =>?? и: class_name =>?? в моделях

Привет, у меня возникли проблемы с концептуализацией, когда следует использовать :source и когда использовать :class для моих более сложных моделей.

Здесь у меня есть пример пользователей с друзьями.

class User < ActiveRecord::Base
  ...
  has_many :friendships, :dependent => :destroy
  has_many :friends, :through => :friendships, :conditions => "status = 'accepted'"
  has_many :requested_friends, :through => :friendships, :source => :friend, :conditions => "status = 'requested'", :order => :created_at
  has_many :pending_friends, :through => :friendships, :source => :friend, :conditions => "status = 'pending'", :order => :created_at
end


class Friendship < ActiveRecord::Base
  attr_accessible :friend_id, :user_id, :status

  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => 'friend_id'
end

Может кто-нибудь объяснить, почему для Дружбы он :class_name вместо :source? Это потому, что это просто спаривание (has_many +: source, принадлежит_to +: class_name)?

4b9b3361

Ответ 1

Они концептуально одинаковы, просто нужно быть разными для разных целей.

:source используется (необязательно) для определения ассоциированного имени модели при использовании has_many through; :class_name используется (необязательно) в простой связи has many. Оба они нужны только в том случае, если Rails не может самостоятельно определить имя класса. См. Документацию для has_many в API здесь.

Ответ 2

Вот примеры использования: source и: class_name.

has_many :subscribers, through: :subscriptions, source: :user

has_many :people, class_name: "Person"

Как вы можете видеть, когда вы используете сквозную таблицу, вы в конечном итоге используете source else, вы используете class_name.

Посмотрите примеры вариантов в этой ссылке: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many