【问题标题】:Can't access User's Role with has_one association无法通过 has_one 关联访问用户角色
【发布时间】:2020-07-22 16:28:54
【问题描述】:

我有一个用户表,其中有一个角色模型的引用。我希望一个用户只有一个角色,所以我在我的 User 模型中设置了一个 has_one 关联,如下所示:

has_one :role

这是我的Role 模型关联:

belongs_to :user

这是我在schema.rb 中用于用户表的内容:

# other stuff
t.bigint "role_id"
t.index ["role_id"], name: "index_users_on_role_id"

我认为我的角色系统计划得很糟糕,但我正在努力挽救它。我想通过使用user.role 来访问用户的角色,其中userUser 模型的一个实例。

为什么当我打电话给user.role 时我收到一条错误消息: ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column roles.user_id does not exist) LINE 1: SELECT "roles".* FROM "roles" WHERE "roles"."user_id" = $1 L...

更新
创建角色表的迁移文件:

class CreateRoles < ActiveRecord::Migration[6.0]
  def change
    create_table :roles do |t|
      t.string :name, null: false, default: ""
      t.boolean :can_delete_any_job, null: false, default: false
      t.boolean :can_kick_any_user, null: false, default: false
      t.boolean :can_claim_any_application, null: false, default: false
      t.boolean :can_create_events, null: false, default: false
      t.boolean :can_create_news_announcement, null: false, default: false
      t.timestamps
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    您需要在roles 表上有一个名为user_id 的列。您可以创建一个新的迁移来解决这个问题。

    rails g migration add_missing_columns
    
    # in the migration
    add_column :roles, :user_id, :integer
    remove_column :users, :role_id
    
    # then in console
    rails db:migrate
    

    但理想情况下,您会想要一个类似的连接表

    create_table :roles_users do |t|
      t.references :user
      t.references :role
    end
    

    然后

    class User < ApplicationRecord
      has_many :roles_users
      has_many :roles, through: :roles_users
    end
    
    class Role < ApplicationRecord
      has_many :roles_users
      has_many :users, through: :roles_users
    end
    
    class RolesUser < ApplicationRecord
      belongs_to :user
      belongs_to :role
    end
    

    【讨论】:

      【解决方案2】:

      您需要将“user_id”字段添加到角色表。您将模型中的关联保持原样,这将解决问题。这是因为具有belongs_to 关联的模型将存储外键。

      另外,我建议您将 role_id 存储在 users 表中,因为多个用户将具有相同的角色。因此,这将避免每个用户在角色表中的角色重复。 因此,角色模型将具有“has_one”关联,而用户模型将具有“belongs_to”关联。外键“role_id”将进入用户表。并且,最后保持角色表现在的样子。

      参考帮助文档:https://guides.rubyonrails.org/association_basics.html#the-has-one-association

      【讨论】:

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