Rails有很多关系

时间:2015-04-17 06:42:19

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

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

有没有办法让这种关系奏效?

3 个答案:

答案 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表。很明显,所有者不能指向它的猫,因为你需要为每只猫指针。它会像

所有者表

  • cat_1
  • cat_2
  • cat_3

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

如果另一方面你有

猫表

  • owner_id

然后每个拥有者可以拥有无​​限量的猫。

更复杂

一段时间后,你得到一个请求,一些业主共享一只猫。你想一想,并决定一只猫只能拥有最多2个主人。

所以你改变猫表。

猫表

  • OWNER_1
  • owner_2

B中。多对多

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

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

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

成员

  • USER_ID
  • ACCOUNT_ID

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

成员

  • USER_ID
  • ACCOUNT_ID
  • 经理(真/假)

你可以超越它并将管理者更改为角色列,然后每个用户都可以在每个帐户中拥有不同的角色。

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

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