0

我正在阅读使用 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
4

1 回答 1

0

你是对的,你不需要源,因为你正在删除 through 参数

用户没有可能的用户

用户有许多追随者,每个追随者都有一个用户,因此您需要:

class User < ActiveRecord::Base
  has_many :followings
  has_many :users, :through => :followings
end

在这里查看更多:

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

于 2013-03-18T10:50:57.933 回答