2016-04-03 15 views
0

das sind meine drei Modelle:Ruby on Rails has_many: durch Vereinigung Controller

Modell für Benutzer:

class User < ActiveRecord::Base 
has_many :patients, through: :treatments 
has_many :treatments 
. 
. 
. 

Modell für Patienten:

class Patient < ActiveRecord::Base 
has_many :user, through: :treatments 
has_many :treatments, dependent: :destroy 
. 
. 
. 

Modell für die Behandlung:

class Treatment < ActiveRecord::Base 
belongs_to :patient 
belongs_to :user 
validates :patient_id, presence: true 
default_scope -> { order(created_at: :desc) } 
end 

Und das ist mein Behandlungstisch:

class CreateTreatments < ActiveRecord::Migration 
    def change 
    create_table :treatments do |t| 
     t.date :teartment_date 
     t.text :remark 
     t.float :fee 
     t.references :patient, index: true, foreign_key: true 

     t.timestamps null: false 
    end 
    add_index :treatments, [:patient_id, :created_at] 
end 
end 

jetzt möchte ich einen Controller definieren, eine neue Behandlung zu erstellen, die auf einen bestimmten Benutzer des Patienten gehört.

das ist mein Controller:

def new 
    @treat = Treatment.new 
    end 

    def create  

    @userpatient = current_user.treatments.build(treat_params) 

    if @userpatient.save 
    flash[:success] = "new treatment added" 
    redirect_to root_url 
    else 
    render 'new' 
    end 
end 

aber dies ist der Fehler, die ich erhalte, während ich eine neue Behandlung erstellen möchten:

ActiveRecord::UnknownAttributeError in TreatmentsController#create 

unknown attribute 'user_id' for Treatment. 

und dies ist der current_user:

def current_user 
    if (user_id = session[:user_id]) 
    @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
    user = User.find_by(id: user_id) 
    if user && user.authenticated?(cookies[:remember_token]) 
    log_in user 
    @current_user = user 
    end 
    end 
    end 

Ich bin neu bei Schienen, die Grundidee ist, dass ich möchte, dass mein Benutzer eine Behandlung erhält, die zu einem bestimmten Patienten gehört ent.

Dank der Antworten habe ich dieses Problem gelöst, indem ich eine Referenzspalte hinzugefügt habe. Jetzt bekomme ich keine, aber es spart keine Behandlungen. Ich meine, das Teil:

if @treat.save 
    flash[:success] = "new treatment added" 
    redirect_to root_url 
else 
    render 'new' 
end 

es nicht retten und macht nur ‚neu‘.

ich habe 2 Fragen:

1-, wie kann ich meine Controller-Code erstellen?

2- Wie erhalte ich meine Behandlungsbasis auf patient.what variable sollte ich in meiner Patienten "show" -Methode definieren, um ihre Behandlungen abrufen zu lassen?

+1

Sie sollten 'user_id' in' treatments' Tabelle haben. – Pavan

+0

wie man es hinzufügt? – Shahryar

+1

Verwenden Sie eine Migration, um die Benutzer-ID hinzuzufügen, wie @Pavan zuvor in den Kommentar geschrieben hat. Sie können eine Referenz wie 'add_reference: treatments,: user, index: true' verwenden. – unused

Antwort

1

Wenn Sie sagen, dass Userhas_many :treatments und dass Treatmentbelongs_to :user, beide Verbände eine user_id Spalte in Ihrer treatments Tabelle finden erwarten. Sie könnten Ihre Migration ändern aufnehmen möchten:

t.integer :user_id 

und dann Tabellen fallen (wenn sie noch keine Daten haben!) Und die Migrationen erneut ausführen. Alternativ können Sie eine neue Migration erstellen und einfach Folgendes ausführen:

add_column :treatments, :user_id, :integer 
+0

Vielleicht möchten Sie einen Index hinzufügen, ich würde auch vorschlagen, 'add_reference' zu ​​verwenden. – unused

+0

Ich denke, der Benutzer ist ein Patient - also vielleicht has_many: Patienten, foreign_key: "user_id". – Ronna

+0

nein der Benutzer ist kein Patient – Shahryar

Verwandte Themen