2017-10-12 4 views
0

Je dispose de plusieurs types d'utilisateurs définis dans un seul modèle utilisateur:profils en cours de création sans clés étrangères dans le modèle lié

enum role: { staff: 0, clinician: 1, admin: 2 } 

utilisateurs cliniciens ont chacun un profil clinicien qui est créé automatiquement à l'aide after_create, et je suis l'intention pour stocker l'ID clinician_profile sur la table des utilisateurs. Pour une raison quelconque, lorsque les profils de clinicien sont créés, clinician_profile_id reste null sur la table des utilisateurs pour tous les utilisateurs, y compris les utilisateurs cliniciens. Comment puis-je résoudre ce problème?

Module ClinicianUser

extend ActiveSupport::Concern 

    included do 
    belongs_to :clinician_profile 
    has_many :lists 
    has_many :universities, through: :lists 
    has_many :dispatches 
    has_many :referral_requests, through: :dispatches 
    after_create :create_clinician_profile, if: :clinician? 
    belongs_to :market 
    validates :market_id, presence: true, if: :clinician? 
    end 

    class_methods do 
    def create_clinician_profile 
     self.clinician_profile.create! 
    end 

    end 
end 

classe ClinicianProfile < ApplicationRecord

has_one :user, -> { where role: :clinician } 
end 

schéma de la table des utilisateurs:

create_table "users", force: :cascade do |t| 
    t.string "email" 
    t.datetime "created_at",          null: false 
    t.datetime "updated_at",          null: false 
    t.string "password_digest" 
    t.string "remember_digest" 
    t.string "activation_digest" 
    t.boolean "activated",      default: false 
    t.datetime "activated_at" 
    t.string "reset_digest" 
    t.datetime "reset_sent_at" 
    t.string "encrypted_password", limit: 128 
    t.string "confirmation_token", limit: 128 
    t.string "remember_token",  limit: 128 
    t.datetime "confirmed_at" 
    t.integer "role",        default: 0 
    t.string "first_name" 
    t.string "last_name" 
    t.integer "university_id" 
    t.boolean "approved",       default: false 
    t.integer "market_id" 
    t.integer "clinician_profile_id" 
    t.index ["clinician_profile_id"], name: "index_users_on_clinician_profile_id" 
    t.index ["email"], name: "index_users_on_email", unique: true 
    t.index ["market_id"], name: "index_users_on_market_id" 
    t.index ["remember_token"], name: "index_users_on_remember_token" 
+0

Pouvez-vous ajouter la méthode 'create_clinician_profile'? – max

+0

Je n'ai pas de méthode explicite pour cela - Il est actuellement géré exclusivement par cette ligne dans le module de préoccupation du clinicien: after_create: create_clinician_profile, si:: clinician? – mike9182

+0

Essayez de créer explicitement une méthode 'def create_clinician_profile; self.clinician_profile.create !; end'' – max

Répondre

1

Une méthode de classe ne doit pas être utilisée ici pour fonctionner sur un objet d'instance.

Vous pouvez utiliser un bloc de rappel à la place:

after_create do |user| 
    ClinicianProfile.create(user: user) if clinician? 
end 

De plus, l'association est définie comme belong_to si l'objet parent peut créer l'association aussi, mais c'est juste une opinion personnelle.