2010-08-18 4 views
0

Prendre cet article comme point de départ:proxie association Construire avec par

Rails Way Blog - Association Proxies

et regardant spécifiquement

def create 
    @todo_list = current_user.todo_lists.build params[:todo_list] 
    if @todo_list.save 
    redirect_to todo_list_url(@todo_list) 
    else 
    render :action=>'new' 
    end 
end 

Ceci est une façon de faire en sorte que vous attribuer la propriété à l'utilisateur

MAIS en supposant que la liste de tâches était une relation de plusieurs un has_many par dire

def User < AR:Base 
    has_many :user_todos 
    has_many :todo_lists, :through => :user_todos 
end 

À ce stade ...

@todo_list = current_user.todo_lists.build params[:todo_list] 

fonctionne toujours, mais seulement le todo_list est enregistré et non la jointure. Comment puis-je obtenir la joie des proxies d'association sans avoir beaucoup d'imbriqués if/else si l'instance jointe ou Todo ne valide pas lorsqu'elle est sauvegardée.

Je pensais à quelque chose le long des lignes de ...

@todo_list = cu.user_todos.build.build_to_do(params[:todo_list]) 

mais comme je l'ai mentionné ci-dessus les user_todos ne vous laissez pas sauvé.

Votre aide est grandement appréciée!

Kevin.

+0

Vous parlez de 'User # todo_lists' et de' User # todos' de façon interchangeable, mais ce sont deux choses différentes depuis que vous avez ajusté la structure. Renommer comme ça devrait tout casser. – tadman

+0

Ah oui. Je vais changer ça. Cela ne sauvera quand même pas la jointure! :) –

Répondre

0

Je l'ai travailler ...

Au début, j'avais:

@todo_list = @user.todo_lists.build params[:todo_list] 
@todo_list.save! 

Cela fonctionne quand todolist simplement belongs_to utilisateur mais pas quand c'est une relation plusieurs-à-plusieurs. Quand j'ai changé la relation que j'avais à faire ...

@todo_list = @user.todo_lists.build params[:todo_list] 
@user.save! 

Ceci a sauvé le @user, la jointure et la @todo_list.

Obvious je suppose, mais je me demande si l'exemple d'origine devrait également

current_user.save! 

au lieu de

@todo_list.save! 

Je pensais que l'idée derrière construire était qu'il valide et enregistre les associations lorsque vous sauvez le parent ainsi fait l'exemple au Rails Way manquez le point? ou plus probablement suis-je?

0

Essayez de faire quelque chose le long des lignes de:

current_user.todo_lists << TodoList.new(params[:todo_list]) 
+0

Merci Matt. Je n'ai jamais vraiment compris la différence entre la construction et ce que vous avez fait ici pour être honnête. Vous ne savez pas si c'est une bonne réponse ou non?:) mais merci de m'avoir fait regarder différemment. –

+0

Pensez-y un peu plus - Je suppose que la construction vous permet d'assigner la nouvelle instance de ToDoList à une variable sur une seule ligne. sans avoir à faire: @todo_list = ToDoList.new (params [: todo_list]) current_user.todo_lists << @todo_list –

Questions connexes