title: How do I specify the join table on a has_many through association?
body: <p>Here is the schema information on my tables:</p>
  
  <ul>
  <li>table_name: <strong>admin_users</strong>, primary_key: id</li>
  <li>table_name: <strong>UserCompanies</strong>, primary_key: UserCompanyId, foreign_keys: [CompanyId, UserId]</li>
  <li>table_name: <strong>Companies</strong>, primary_key: CompanyId'</li>
  </ul>
  
  <p>I want to do something like the following:</p>
  
  <p><code>AdminUser.first.companies</code></p>
  
  <p>But, my attempts so far are not working, I'm assuming because I need to specify the table names, model names, or key names, but I don't know how that works with a has_many through relationship.  Here is my best attempt at defining it so far:</p>
  
  <pre><code>class AdminUser &lt; 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 &lt; CustomDBConventions
          belongs_to :admin_user
          belongs_to :company
      end
  
      class Company &lt; CustomDBConventions
          has_many :admin_users, through: :user_companies
      end
  
      class CustomDBConventions &lt; 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
  </code></pre>
  
  <p><strong>EDIT:</strong> So this setup is really close and I am missing only 1 foreign key specification.  When I run AdminUser.first.companies I get a sql error:</p>
  
  <p>TinyTds::Error: Invalid column name 'company_id'.: EXEC sp_executesql N'SELECT [Companies].* FROM [Companies] INNER JOIN [UserCompanies] ON [Companies].[CompanyId] = [UserCompanies].[company_id] WHERE [UserCompanies].[UserId] = @0', N'@0 int', @0 = 1</p>
  
  <p>So I just need to specify to use UserCompanies.CompanyId on this join. How do I properly specify this foreign key?</p>