【问题标题】:Association for model - has_many :through模型关联 - has_many :through
【发布时间】:2016-07-26 17:34:15
【问题描述】:

我有三个模型 - CompanyUserCompanyUser。关联如下。

公司.rb

  has_many :company_users
  has_many :users, :through => :company_users

用户.rb

  has_many :company_users, :dependent => :destroy
  belongs_to :company

公司用户.rb

  belongs_to :company
  belongs_to :user

为了获取current_user.company,模型关联需要做哪些修改?

任何帮助将不胜感激。

【问题讨论】:

  • 你能写下你在 Rails 控制台上使用 current_user.company 时得到的输出吗?
  • 你不能把你的FK放在用户模型中,所以用hash_many :companies, :through => :company_users替换belongs_to :company

标签: ruby-on-rails ruby


【解决方案1】:

应该是:

has_many :companies, through: :company_users

has_many :through 关联通常用于建立多对多 与另一个模型的连接。这种关联表明 声明模型可以与另一个的零个或多个实例匹配 通过第三个模型继续建模。

因此,如果您要创建三个模型并建立has_many :through 关联,我相信User will have many CompaniesCompany will have many Users

但是如果您需要用户只属于一个company 而不是创建第三个模型,请将company_id 保存在users 表本身中。

更新:

现在您的场景是A company can have may usersUser belongs to a single company,您需要两个模型:UserCompany。你的User 模型应该有一个属性company_id,然后company_id 应该只保存在users 表中。那么关联如下:

class User < ActiveRecord::Base
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :users
end

那你就可以current_user.company

您可以在RailsGuides获取更多关于关联的信息

【讨论】:

  • 场景如下。一个公司可以有多个用户。用户属于单个公司。如果我想获取 current_user.copmany ,模型关联会是什么?
  • 更新了答案
【解决方案2】:

根据你所采取的联想,

用户已经通过公司用户模型与公司建立了关联,因此根据您的关联,用户可能拥有许多公司。

所以,

  class User < ActiveRecord::Base

    has_many :company_users, :dependent => :destroy
    has_many :companies, :through => :company_users

  end  

current_user.companies 会给你公司。

但是,如果您只需要一个公司为一个用户,那么,

  class User < ActiveRecord::Base
        belongs_to :company
    end  

获取belongs_to公司并将company_id保存在用户表中,

then you can call,

`current_user.company`

【讨论】:

    【解决方案3】:

    根据你的逻辑, 我认为您可能需要创建一个新的变量会话current_company_user,它是对象 CompanyUser。 然后,通过以下方式获取公司:

    current_company_user.company
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多