理由:has_many中的来源

时间:2013-03-18 06:51:37

标签: ruby-on-rails

我正在阅读使用Ruby on Rails的面向服务的设计,其中包含您在此图像中看到的代码

enter image description here

我的问题是关于用户模型中的这一行

has_many :followers, :through -> :followings, :source => :user

其中用户(在用户模型的实例中)has_many:关注者,实际上只是其他用户。因此用户拥有多个用户。对我来说这似乎很奇怪,一个用户has_many:用户,好像什么东西应该在你写这个时打破,所以我想doign has_many:followers ...:source => :用户可能意味着阻止事情破裂。

根据关于这个问题Need help to understand :source option of has_one/has_many through of Rails的一个答案,这是关于:has_many关联的源方法,使用的一个基本原理: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

1 个答案:

答案 0 :(得分:0)

你是对的,你不需要源,因为你要删除通过参数

用户没有可能的用户

用户有许多关注者,每个人都有一个用户需要:

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