我正在阅读使用 Ruby on Rails 进行面向服务的设计,其中包括您在此图像中看到的代码
我的问题是关于用户模型中的这一行
has_many :followers, :through -> :followings, :source => :user
其中一个用户(如在用户模型的一个实例中)有很多:followers,它们实际上只是其他用户。所以一个用户 has_many users。对我来说,用户 has_many :users 似乎很奇怪,好像你写的时候应该有什么东西坏了,所以我认为 doign has_many :followers ...:source => :user 可能是为了阻止事情发生。
根据这个 SO question Need help to understand :source option of has_one/has_many through of Rails,这是关于 has_many 关联的 :source 方法的一个答案,使用 :source 的一个理由是采用看起来像这样的代码
class Newsletter
has_many :subscriptions
has_many :users, :through => :subscriptions
end
并将其更改为
class Newsletter
has_many :subscriptions
has_many :subscribers, :through => :subscriptions, :source => :user
end
所以而不是这样做
Newsletter.find(id).users
一个会做得更合乎逻辑(因为时事通讯有订阅者而不是用户)
Newsletter.find(id).subscribers
所以,回到书中的代码,我的问题是,在用户模型中这样做的唯一理由是
has_many :followers, :through -> :followings, :source => :user
制作更具可读性的代码User.find(id).followers
?否则不会有问题
User.rb
has_many :users
因为如果Rails 允许您这样做(即它不会破坏应用程序),那么您会将belongs_to 放在哪里?
User.rb
has_many :users
belongs_to :user
这对我来说似乎很奇怪,但是如果 :source 只是为了让您编写更清晰的查询,那么这段代码应该仍然有效吗?
更新:问题的关键是,有什么能阻止任何人这样做吗?
User.rb
has_many :users
belongs_to :user