Rails 有很多直通关系

Rails has many through relationship

在我的 Rails 应用程序中,我有以下模型:

class User < ActiveRecord::Base
   # user declaration
   has_many :account
end

class Account < ActiveRecord::Base
   belongs_to :user
end

我需要添加另一个关系,其中每个 Account 可以由多个 AccountManagers 管理。但是,AccountManagers 本身也是该系统的 Users(即 User 可以同时拥有 Account 并管理另一个用户的帐户)。

我是 Rails 的新手,我知道我可以创建另一个名为 AccountManagers 的模型。我有一种感觉,我们不需要制作另一个模型;我提出的 AccountManagers 模型中包含的所有信息也在 Users 模型中找到。

我尝试将以下关系添加到 Account 模型:

has_many :account_managers, through: :users, source: :users

其中 Account 有很多经理,每个经理都是从 User 模型声明的。这不起作用,因为 AccountManagers table 不存在(并且视图中的错误也说明了这一点)。

有没有办法让这种关系发挥作用?

您不需要添加另一个 class AccountManager,您可以像这样添加一个关系:

class User < ActiveRecord::Base
   # user declaration
   has_many :account
   has_many :managed_accounts, :class_name => 'Account', :primary_key => :account_manager_id 
end

class Account < ActiveRecord::Base
   belongs_to :user
   belongs_to :account_managers, : class_name => :User, :foreign_key => :account_manager_id
end

为此,您需要在 accounts table 中包含 account_manager_id

您必须添加另一个联接 table,例如 account_managementsuser_id 以及 account_id

class User < ActiveRecord::Base
   # user declaration
   has_many :accounts
   has_many :managed_accounts, :source => :account, :through => :account_managements 
end

class Account < ActiveRecord::Base
   belongs_to :user
   has_many :account_managers, :source => :user, :through => :account_managements
end

class AccountManagement < ActiveRecord::Base
   belongs_to :user
   belongs_to :account
end

我在这里看到的主要问题是用户 has_many 帐户,但在您的示例中,一个帐户只有 1 个用户。您打算拥有只有 1 个人的帐户吗?

在关系 table 中有 2 种主要的 table 设计。

一个。一对多

你有一种关系,其中一件事有很多另一件事,例如:一个所有者有很多猫。在这种类型的关系中,Cat table 可以指向 Owner table。显然,所有者不能指向它的猫,因为你需要为每只猫提供一个指针。它会像

业主table

  • cat_1
  • cat_2
  • cat_3

一点也不方便,因为猫的数量是有上限的。

如果另一方面你有

猫table

  • owner_id

那么每个主人可以拥有无​​限数量的猫。

更复杂

一段时间后,您收到请求,一些所有者共享一只猫。你考虑了一下,决定一只猫最多只能属于两个主人。

所以你换猫了table。

猫table

  • owner_1
  • owner_2

乙。多对多

如果你想让一只猫拥有无限数量的主人,或者一个主人拥有无限数量的猫,你将需要第三个 table。这个 table 将 link 从 1 只猫送给 1 位主人。每行都定义了这种关系。这个 table 可以使用其他 2 个 table 的名称来命名:cat_owners 或者因为这个 table 定义了一个关系,你可以给它一个定义这个关系的名字.

在这种情况下,关系是所有权,人们拥有猫。很难说猫会如何定义这种关系:)

这让我终于可以回答你的问题了。如果你有一个 table 定义了用户和帐户之间的 link,我喜欢这个名字 Membership

会员资格

  • user_id
  • account_id

但正如您刚才提到的,帐户中有一些用户是管理员,您可以将此标志添加到成员资格中 table。

会员资格

  • user_id
  • account_id
  • 经理(true/false)

你可以更进一步,将经理更改为角色列,然后每个用户都可以在每个帐户中拥有不同的角色。

如果每个用户可以在每个帐户中拥有多个角色会怎么样?那么你将需要更多 tables

Rails 并不意味着你可以跳过对关系数据库结构的理解。