加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何通过关联在has_many上指定连接表?

发布时间:2020-12-17 02:24:31 所属栏目:百科 来源:网络整理
导读:这是我的表的架构信息: table_name:admin_users,primary_key:id table_name:UserCompanies,primary_key:UserCompanyId,foreign_keys:[CompanyId,UserId] table_name:Companies,primary_key:CompanyId’ 我想做类似以下的事情: AdminUser.first.comp
这是我的表的架构信息:

> table_name:admin_users,primary_key:id
> table_name:UserCompanies,primary_key:UserCompanyId,foreign_keys:[CompanyId,UserId]
> table_name:Companies,primary_key:CompanyId’

我想做类似以下的事情:

AdminUser.first.companies

但是,到目前为止我的尝试都没有用,我假设是因为我需要指定表名,模型名或键名,但我不知道如何使用has_many通关系.到目前为止,这是我最好的定义:

class AdminUser < ActiveRecord::Base
    has_many :user_companies,class_name:"TableModule::UserCompany",foreign_key:"UserId"
    has_many :companies,through: :user_companies,class_name: "TableModule::Company"
end

# this code is from a rails engine separate from the app where AdminUser is defined
# the purpose of the engine is to provide access to this particular database 
# the CustomDBConventions class adapts the models for this database to work with ActiveRecord so we can use snake case attributes,reference the primary key as 'id',and it specifies the correct tables names.
module TableModule
    class UserCompany < CustomDBConventions
        belongs_to :admin_user
        belongs_to :company
    end

    class Company < CustomDBConventions
        has_many :admin_users,through: :user_companies
    end

    class CustomDBConventions < ActiveRecord::Base
        self.abstract_class = true
        def self.inherited(subclass)
            super
            subclass.establish_connection "table_module_#{Rails.env}".to_sym
            tb_name = subclass.table_name.to_s.gsub(/^table_module_/,"").classify.pluralize
            subclass.table_name = tb_name
            subclass.primary_key = tb_name.singularize + "Id"
            subclass.alias_attribute :id,subclass.primary_key.to_sym
            subclass.column_names.each do |pascal_name|
                subclass.alias_attribute pascal_name.underscore.to_sym,pascal_name.to_sym
                subclass.alias_attribute "#{pascal_name.underscore}=".to_sym,"#{pascal_name}=".to_sym
            end
        end
    end
end

编辑:所以这个设置非常接近,我只缺少1个外键规范.当我运行AdminUser.first.companies时,我收到一个SQL错误:

TinyTds ::错误:列名’company_id’无效:EXEC sp_executesql N’SELECT [公司].* FROM [公司] INNER JOIN [UserCompanies] ON [Companies].[CompanyId] = [UserCompanies].[company_id] WHERE [用户公司].[UserId] = @ 0′,N’@ 0 int’,@ 0 = 1

所以我只需要指定在此连接上使用UserCompanies.CompanyId.如何正确指定此外键?

解决方法

假设TableModule :: UserCompany模型具有这些关联…

class TableModule::UserCompany < ActiveRecord::Base
  belongs_to :admin_user
  belongs_to :company
end

…那么我认为这就是你所追求的:

class AdminUser < ActiveRecord::Base
  has_many :companies,through: :user_company,class_name: "TableModule::UserCompany"
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读