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