2016-04-13 4 views
1

ich in Rails-Anwendungen zu viele Verbindungs ​​eine viele haben, sieht es wie folgt aus:zu viele Beziehung in vielen einen Datensatz hinzufügen nicht

class Workspace 
    has_and_belongs_to_many :users, dependent: :destroy 
end 

class User 
    has_and_belongs_to_many :workspaces 
end 

class UserWorkspace 
    belongs_to :user 
    belongs_to :workspace 
end 

Schema:

create_table :users_workspaces do |t| 
    t.integer :user_id 
    t.integer :workspace_id 
    t.integer :role, default: 0 

    t.timestamps null: false 
end 

Dann möchte ich eine erstellen neuer Rekord wie folgt aus:

@user.workspaces.create(:workspace_id => @workspace.id, :role => 1) 

oder diese

@user.workspaces << @workspace 

und haben einen Fehler in logs:

(0.0ms) begin transaction 
(0.0ms) begin transaction 
(0.1ms) rollback transaction 
(0.1ms) rollback transaction 
Completed 500 Internal Server Error in 207ms (ActiveRecord: 5.5ms) 
Completed 500 Internal Server Error in 207ms (ActiveRecord: 5.5ms) 

ActiveRecord::UnknownAttributeError (unknown attribute 'workspace_id' for Workspace.): 
app/controllers/sessions_controller.rb:10:in `block in sign_up' 
app/controllers/sessions_controller.rb:4:in `sign_up' 

Was mache ich falsch?

PS Controller:

def sign_up 
respond_to do |format| 
    @user = User.new(user_params) 
    if @user.save 
    @workspace = Workspace.new(title: "#{@user.name}'s workspace") 
    @workspace.save 
    puts "workspace id: #{@workspace.id}" 
    @user.workspaces.create(:workspace_id => @workspace.id, :role => 1) 
    puts "workspaces count: #{@user.workspaces.count}" 
    @user.workspace = @workspace 
    @user.update_attributes(user_params) 

    flash.now[:success] = 'Welcome! Please check activation letter in your email box.' 
    format.js { render 'signup_message' } 
    else 
    format.js { render 'render_signup_errors' } 
    end 
end 
end 

private 

def user_params 
    params.require(:user).permit(:email, :password, :password_confirmation, :name, :workspace_id) 
end 
+0

Ihre '@ user' und' @ workspace' Objekt wurde bereits beibehalten? Bitte fügen Sie hier Ihren Controller-Code hinzu. – Uzbekjon

+0

'def sign_up antworten_zu tun | format | @user = Benutzer.neu (user_params) if @ user.save @workspace = Arbeitsbereich.neu (Titel: "#{@user.name}'s Arbeitsbereich") @ workspace.save @ user.workspaces. create (: workspace_id => @ workspace.id,: rolle => 1) @ user.workspace = @workspace @ user.update_attributes (benutzer_params) flash.now [: success] = 'Willkommen! Bitte überprüfen Sie den Aktivierungsbrief in Ihrer E-Mail-Box. format.js {machen ‚signup_message‘} sonst format.js {machen ‚render_signup_errors‘} Ende Ende Ende –

+0

sorry für schlechtes Format –

Antwort

1

Es gibt einige Probleme mit Ihrem Code. Zum Beispiel, erstellen Sie Arbeitsbereiche, die bereits erstellt werden (@user.workspaces.create) oder ein :workspace_id ermöglicht, die nicht verwendet wird, usw.

Pleas siehe Code unten:

def sign_up 
    respond_to do |format| 
    @user = User.new(user_params) 
    if @user.save 

     @workspace = Workspace.new(title: "#{@user.name}'s workspace") 

     if @workspace.save 
     # Like this 
     UserWorkspace.create(user: @user, workspace: @workspace, role: 1) 

     # Or, like this 
     @user.user_workspaces.create!(workspace_id: @workspace.id, role: 1) 
     end 

     flash.now[:success] = 'Welcome! Please check activation letter in your email box.' 
     format.js { render 'signup_message' } 
    else 
     format.js { render 'render_signup_errors' } 
    end 
    end 
end 

private 

# You don't need :workspace_id since you are not using it anywhere 
def user_params 
    params.require(:user).permit(:email, :password, :password_confirmation, :name) 
end 
+0

vielen Dank! –

Verwandte Themen