在我的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
表不存在(并且视图中的错误也表明了这一点)。
有没有办法让这种关系奏效?
答案 0 :(得分:1)
您必须添加另一个联接表,例如account_managements
包含列和user_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
答案 1 :(得分:0)
您不需要添加另一个类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
为此,您需要account_manager_id
表中的accounts
。
答案 2 :(得分:0)
我在这里可以看到的主要问题是用户拥有多个帐户,但在您的示例中,一个帐户只有一个用户。你打算在其中只有一个人的帐户吗?
在关系表中有两种主要的表格设计。
你有一种关系,其中一件事有许多另一件事,例如:一个所有者有许多猫。在这种类型的关系中,Cat表可以指向Owner表。很明显,所有者不能指向它的猫,因为你需要为每只猫指针。它会像
这根本不方便,因为猫的数量最多。
如果另一方面你有
然后每个拥有者可以拥有无限量的猫。
一段时间后,你得到一个请求,一些业主共享一只猫。你想一想,并决定一只猫只能拥有最多2个主人。
所以你改变猫表。
如果您希望能够允许猫拥有任意数量的拥有者,或者拥有拥有无限数量的猫,那么您将需要第三张桌子。此表保存从1只猫到1个所有者的链接。每行定义这种关系。可以使用其他2个表的名称来命名此表:cat_owners,或者由于此表定义了一个关系,因此可以为其定义一个定义此关系的名称。
在这种情况下,关系是所有权,人们拥有自己的猫。很难说猫如何定义这种关系:)
这让我最终回答你的问题。如果你有一个表定义用户和帐户之间的链接,我喜欢名称Membership
但正如您刚才提到的,帐户中有一些用户是Managers,您可以将此标志添加到成员资格表中。
你可以超越它并将管理者更改为角色列,然后每个用户都可以在每个帐户中拥有不同的角色。
如果每个用户可以在每个帐户中拥有多个角色,该怎么办?那你就需要更多的桌子
Rails并不意味着你可以跳过理解关系数据库的结构。