2012-10-12 2 views
0

J'ai un Score qui appartient à Client - et Client has_one Score.Comment attribuer un nouvel objet à current_user et à une association has_one?

Je veux également affecter le Score à User à la création. Donc, chaque fois qu'un current_user crée un score pour un client particulier, je veux que le current_user.id soit stocké avec cet enregistrement Score.

Quelle est la meilleure façon de faire cela?

Je pensais qu'une manière élégante pourrait être un Score belongs_to User, :through Client mais cela ne peut pas fonctionner.

Donc, je suppose que le meilleur moyen est d'ajouter simplement user_id au modèle Score, et faites-le comme ça. Mais alors comment affecter le user_id dans le Score#create?

Voici comment créer mes actions semble:

def create 
    @score = current_user.scores.new(params[:score]) 

respond_to do |format| 
    if @score.save 
    format.html { redirect_to @score, notice: 'Score was successfully created.' } 
    format.json { render json: @score, status: :created, location: @score } 
    else 
    format.html { render action: "new" } 
    format.json { render json: @score.errors, status: :unprocessable_entity } 
    end 
end 

fin

Cela affecte automatiquement le score à la client_id qui est dans le hachage params[:score] - mais il ne fait pas la même chose pour user_id .

Ce qui donne?

Répondre

1

Tant que vous avez Score.belongs_to :user, et la colonne user_id d'accompagnement dans le tableau scores:

def create 
    @score = Score.new(params[:score]) 
    @score.user = current_user 

    ... 
end 

Laissez-moi savoir si vous avez besoin d'explications, mais je pense que le code est assez clair.

Modifier Ou: Au lieu de current_user.scores.new, utilisez current_user.scores.build(params[:score]), et assurez-vous que vous avez User.has_many :scores

+0

ne doit pas '@score = current_user.scores.new (params [: Partition])' faire? Pourquoi est-ce différent? – marcamillion

+0

Si ce n'est pas le cas, à quoi bon le faire comme je l'ai fait - ou n'y a-t-il pas lieu de le faire comme ça? – marcamillion

+0

'current_user.scores' retourne une instance de Array (ou' ActiveRecord :: Relation' en fonction de la configuration de l'association) donc vous aurez une erreur. Vous pouvez utiliser l'assistant Rails, 'current_user.scores.build (params [: score])' qui fera ce que vous cherchez, mais je trouve qu'il est plus clair de le faire comme je l'ai spécifié (ils sont essentiellement les même si). – bricker

Questions connexes