2016-09-12 3 views
0

Ich habe drei Modelle User, Account und AccountPermission genannt.Schienen verschachtelte Attribute speichern

ich etablierten Assoziationen zwischen User und Account durch AccountPermission so, es ist has_many :through

I creator_id auch User und Account mit has_many über etabliert. Weil ich den Ersteller von Konten kennen muss.

Hier ist meine Assoziationen,

associations

user.rb

class User < ActiveRecord::Base 

    has_many :created, class_name: 'Account', :foreign_key => 'creator_id' 

    has_many :account_permissions, :class_name => 'AccountPermission' 
    has_many :accounts, through: :account_permissions 

    accepts_nested_attributes_for :account_permissions 

account.rb

class Account < ActiveRecord::Base 

    belongs_to :creator, class_name: 'User' 

    has_many :accounts_permissions, :class_name => 'AccountPermission' 
    has_many :users, through: :accounts_permissions 

account_permission.rb

class AccountPermission < ApplicationRecord 
    belongs_to :user 
    belongs_to :account 

    accepts_nested_attributes_for :account 

Controller # new

def new 
    @user = User.new 
    @user.account_permissions.build.build_account 
    respond_with(@user) 
end 

Ich schaffe Account und User gleichzeitig mit verschachtelten Attributen. Ich möchte jedoch auch eine creator_id zu meiner User in derselben Transaktion hinzufügen.

Ich bin derzeit creator_id meinen Benutzer wie diese Zugabe ;,

resource.accounts.last.update(creator_id: resource.id)

Es ist eine wirklich niedriges Niveau Lösung, und ich fühle mich nicht gut mit ihm. Weil ich jedes Mal eine zusätzliche Aktualisierungsabfrage sende.

Frage ist, gibt es eine Möglichkeit, dies bei der Kontoerstellung zu behandeln?

AKTUALISIERT

def create 
    build_resource(sign_up_params) 
    resource.save 
    yield resource if block_given? 
    if resource.persisted? 

     # TODO: 
     resource.accounts.last.update(creator_id: resource.id) 

     if resource.active_for_authentication? 
     set_flash_message! :notice, :signed_up 
     sign_up(resource_name, resource) 
     respond_with resource, location: after_sign_up_path_for(resource) 
     else 
     set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}" 
     expire_data_after_sign_in! 
     respond_with resource, location: after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords resource 
     set_minimum_password_length 
     respond_with resource 
    end 
    end 

Antwort

0

Vielleicht Rückruf after_create in Modell-Konto verwenden?

class Account 

after_create :give_creator_id 

    def give_creator_id 
    creator_id = accounts_permissions.first.user_id 
    end 

end 
+0

Ja, aber ich möchte es während der ersten Transaktion hinzufügen, dass Konto und Benutzer erstellen. – utkuDAT

+0

teilen Sie Methode 'create' von contoller, wenn Sie können –

+0

meine Frage aktualisiert – utkuDAT

Verwandte Themen