三种模型之间的正确关联

时间:2014-02-17 02:30:21

标签: ruby-on-rails associations

我正在努力寻找关联三种模型的最简单的解决方案:

  1. 用户
  2. 组织
  3. 作用
  4. 用户和组织是HABTM关联 - 一个用户可以拥有多个组织,反之亦然。

    一个用户也可以拥有多个角色,但每个组织只能拥有一个角色。

    现在我的模型中有这个:

    user.rb

    class User < ActiveRecord::Base
      has_many :roles, through: :organizations
      has_and_belongs_to_many :organizations, :join_table => :organizations_users
    end
    

    organization.rb

    class Organization < ActiveRecord::Base
      has_and_belongs_to_many :users, :join_table => :organizations_users
      has_many :roles
    end
    

    role.rb

    class Role < ActiveRecord::Base
      has_many :users, through: :organizations
      belongs_to :organizations
    end
    

    这有意义吗?

1 个答案:

答案 0 :(得分:1)

以下是我的:

  • 鉴于您使用的是has_and_belongs_to_many并且给定了Rails的默认值,您的join_table规范是多余的
  • 只有在has_many :roles, through: :organizations表中同时包含roleuser字段时,您的organizations才有效,因为Rails会期望执行SQL {{1}该表寻找那些字段。

由于您希望用户每个组织最多只能有一个角色,因此我认为最简单的方法是将select字段添加到role模型中,如下所示:

<强> user.rb

organizations_users

<强> organization.rb

class User < ActiveRecord::Base
  has_many :roles, through: :organizations_users
  has_many :organizations, :through => :organizations_users
  has_many :organizations_users
end

<强> organization_user.rb

class Organization < ActiveRecord::Base
  has_many :users, :through => :organizations_users
  has_many :roles, :through => :organizations_users
  has_many :organizations_users
end

<强> role.rb

class OrganizationUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :organization
  belongs_to :role
end

以上假设您有理由希望class Role < ActiveRecord::Base end 继续成为Role而不是ActiveModel表中的字符串字段。