Ruby on rails 3 理解:Rails的has_one/has_many through的源选项

Ruby on rails 3 理解:Rails的has_one/has_many through的源选项,ruby-on-rails-3,rails-activerecord,Ruby On Rails 3,Rails Activerecord,请帮助我理解的:source选项has\u one/has\u many:throughassociation。Rails API的解释对我来说意义不大 “指定使用的源关联名称有多个:到=> :查询。仅当无法从 关联。拥有多个:订阅者,:至=>:订阅者将 在订阅上查找:订阅者或:订阅者, 除非给出了:source。” 让我进一步说明这个例子: class User has_many :subscriptions has_many :newsletters, :through =>

请帮助我理解
:source
选项has\u one/has\u many:through
association。Rails API的解释对我来说意义不大

“指定
使用的源关联名称有多个
:到=>
:查询
。仅当无法从 关联。
拥有多个:订阅者,:至=>:订阅者将
在
订阅
上查找
:订阅者
:订阅者
, 除非给出了
:source
。”


让我进一步说明这个例子:

class User
  has_many :subscriptions
  has_many :newsletters, :through => :subscriptions
end

class Newsletter
  has_many :subscriptions
  has_many :users, :through => :subscriptions
end

class Subscription
  belongs_to :newsletter
  belongs_to :user
end
使用此代码,您可以执行类似于
Newsletter.find(id).users的操作,以获取新闻稿订户的列表。但是,如果您想更清楚,并且能够键入
Newsletter.find(id).subscribers
,则必须将Newsletter类更改为:

class Newsletter
  has_many :subscriptions
  has_many :subscribers, :through => :subscriptions, :source => :user
end

您正在将
用户
关联重命名为
订户
。如果您不提供
:source
,Rails将在Subscription类中查找名为
subscriber
的关联。您必须告诉它使用Subscription类中的
用户关联来创建订阅者列表。

有时,您需要为不同的关联使用不同的名称。如果要在模型上用于关联的名称与
:至
模型上的关联名称不同,则可以使用
:source
指定该名称

我不认为上面的段落比文档中的段落更清楚,所以这里有一个例子。让我们假设我们有三个模型,
Pet
Dog
Dog::bride

class Pet < ActiveRecord::Base
  has_many :dogs
end

class Dog < ActiveRecord::Base
  belongs_to :pet
  has_many :breeds
end

class Dog::Breed < ActiveRecord::Base
  belongs_to :dog
end
有了
:source
,我们告诉Rails在
Dog
模型上查找一个名为
:breeds
的关联(因为这是用于
:dogs
的模型),并使用它。

最简单的答案:


是中间表中关系的名称。

我想你的意思是你最后一班的动物被称为“类宠物”,我只是一个打字而已。
Dog
下的关联是否应该是
而不是
:breeds
的多个:breed
,然后
:source
:breed
单数,以表示模型名,而不是代表表名的
:breeds
?例如,
有很多:狗的品种,:通过=>:dogs,:source=>:breed
(没有
s
后缀
:breed
)?我已经测试过了。它是单数的,在
:source=>
中没有
s
后缀。“在这种情况下,我们选择了Dog::bride的名称空间,因为我们希望访问Dog.find(123).brides作为一个友好而方便的关联。”。您不需要名称空间,是吗?请注意,singularize模型名称应在
:source=>
中使用,而不是复数形式。所以,
:users
是错误的,
:user
是正确的这是最好的答案!,让我强调一下这一部分:“您正在将用户关联重命名为订阅者。如果您不提供:source,Rails将在Subscription类中查找名为subscriber的关联。”
class Pet < ActiveRecord::Base
  has_many :dogs
  has_many :dog_breeds, :through => :dogs, :source => :breeds
end