Rails在名称空间模型中通过缺失的列id实现了(_many)



我肯定我在这里做了什么,但它没有击中我。

# 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" = $1 LIMIT $2

有没有想过为什么它期望列名为host_id

您需要在has_many关联中指定foreign_key

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

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

同样,在Admin::HostUser模型中保留foreign_key,因为它将在您执行类似host_user.admin_host的操作时使用

最新更新