Rails has_many 通过命名空间模型缺少列 id

Rails has_many through missing column id with namespaced models

我确定我在这里做了一些愚蠢的事情,但它并没有打击我。

# models/admin/host.rb
class Admin::Host < ApplicationRecord
  has_many :admin_host_users, class_name: 'Admin::HostUser'
  has_many :users, through: :admin_host_users

# models/user.rb
class User < ApplicationRecord
  has_many :admin_host_users, class_name: 'Admin::HostUser'
  has_many :admin_hosts, through: :admin_host_users

# models/admin/host_user.rb
class Admin::HostUser < ApplicationRecord
  belongs_to :admin_host, class_name: 'Admin::Host', foreign_key: 'admin_host_id'
  belongs_to :user

# schema.rb
create_table "admin_host_users", id: false, force: :cascade do |t|
  t.bigint "admin_host_id"
  t.bigint "user_id"
end

调用时host.users:

> h.users
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column admin_host_users.host_id does not exist)
LINE 1: ..."users"."id" = "admin_host_users"."user_id" WHERE "admin_hos...
                                                             ^
: SELECT  "users".* FROM "users" INNER JOIN "admin_host_users" ON "users"."id" = "admin_host_users"."user_id" WHERE "admin_host_users"."host_id" =  LIMIT 

关于为什么期望列名称是 host_id 的任何想法?

您需要在 has_many 关联中指定 foreign_key

因此,在您的 Admin::Host 模型中:

has_many :admin_host_users, class_name: 'Admin::HostUser', foreign_key: 'admin_host_id'

同时将 foreign_key 保留在 Admin::HostUser 模型中,因为当您执行 host_user.admin_host

之类的操作时将使用它