32

嗨,我在概念化何时使用: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)吗?

4

2 回答 2

27

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

:source用于(可选)在您使用时定义关联的模型名称has_many through:class_name在简单的has many关系中使用(可选)。仅当 Rails 无法自行确定类名时才需要两者。请参阅此处 API 中的 has_many 文档

于 2012-11-28T18:01:32.913 回答
1

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

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

has_many :people, class_name: "Person"

正如您所看到的,当您使用直通表时,您最终会使用sourceelse you use class_name

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

于 2016-10-10T03:54:52.670 回答