【问题标题】:Rails has many through relationshipRails 有很多直通关系
【发布时间】:2015-07-12 14:27:28
【问题描述】:

在我的 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 表不存在(视图中的错误也表明了这一点)。

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

【问题讨论】:

  • 试试这个 "has_many :account_managers, through: :users, :class_name => "User", ,:foreign_key => "account_manager_id""

标签: ruby-on-rails has-many-through


【解决方案1】:

您必须添加另一个连接表,例如带有列的 account_managementsuser_idaccount_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

【讨论】:

  • 可能只是我做错了什么,但是当我尝试加载我的new 路由时,我现在得到了HasManyThroughSourceAssociationNotFoundError(我所做的只是调用Account.newnew 控制器方法。
【解决方案2】:

你不需要添加另一个类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 表中包含account_manager_id

【讨论】:

    【解决方案3】:

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

    在关系表中,有两种主要的表设计。

    A.一对多

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

    所有者表

    • cat_1
    • cat_2
    • cat_3

    这根本不方便,因为猫的数量是最大的。

    如果你有

    猫桌

    • owner_id

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

    更复杂

    一段时间后,您收到请求,一些业主共享一只猫。你想了想,决定一只猫最多只能属于 2 个主人。

    所以你换了猫桌。

    猫桌

    • owner_1
    • owner_2

    B.多对多

    如果您希望能够让猫拥有任意数量的主人,或者主人拥有无限数量的猫,您将需要第三张桌子。该表保留了从 1 只猫到 1 个所有者的链接。每一行都定义了这种关系。该表可以使用其他 2 个表的名称命名:cat_owners 或者由于该表定义了一个关系,因此您可以给它一个定义该关系的名称。

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

    这让我终于回答了你的问题。如果你有一个定义用户和帐户之间链接的表,我喜欢成员资格这个名称

    会员

    • user_id
    • account_id

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

    会员

    • user_id
    • account_id
    • 经理(真/假)

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

    如果每个用户可以在每个帐户中拥有多个角色怎么办?然后你需要更多的桌子

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多