Rails:之间的区别:source => ??和:class_name => ??在模型中

时间:2012-11-28 17:46:21

标签: ruby-on-rails

您好我无法概念化何时使用: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,belongs_to +:class_name)?

2 个答案:

答案 0 :(得分:24)

它们在概念上是相同的,只是需要针对不同的用途而不同。

当您使用:source时,使用

has_many through(可选)定义关联的模型名称; :class_name使用(可选)简单的has many关系。只有当Rails无法自己找出类名时才需要这两者。请参阅documentation for has_many in the API here

答案 1 :(得分:0)

以下是使用的示例:source和:class_name。

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

has_many :people, class_name: "Person"

正如您在使用直通表时所看到的那样,您最终使用source,否则您使用class_name

查看此链接中的选项示例: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many