2009-02-05 8 views
1

J'ai un modèle d'utilisateur qui a beaucoup d'articles. Une évaluation appartient à un utilisateur et à un article.Pourquoi cet appel de création associé ne fonctionne-t-il pas?

Dans la base de données, j'ai défini ratings.user_id comme n'étant pas NULL.

quand je suis en train de créer un élément, je voudrais faire:

def create 
    current_user.items.create(params[:item]).ratings.create(params[:rating] 
    redirect_to items_path 
    end 

Cependant, cette renâcle avec une erreur SQL « user_id ne peut pas être nul »

donc je Réécriture de la méthode de création comme

def create 
    current_user.items.create(params[:item]).ratings.create(params[:rating].merge({:user_id => current_user})) 
    redirect_to items_path 
    end 

qui fonctionne bien.

Cependant, j'avais pensé que chaîner les méthodes de création sur le récepteur de l'utilisateur actuel aurait peuplé user_id de la note. Quelqu'un sait pourquoi pas?

TIA.

Répondre

1

Je vous recommande de normaliser ceci si possible dans la base de données. Peut-être prendre l'attribut user_id de la table de notation et si vous en avez besoin dans votre modèle obtenir par une jointure en utilisant un: par la méthode

class Rating 
    has_many :items 
    has_one :user, :through=>:items 
+0

merci Jeremy. Je vais essayer ça. Un peu d'une question de débutant je réalise. –

+0

Je me demandais juste: est-ce que la note n'appartient pas à un objet, n'a pas beaucoup d'objets? –

+0

oui vous avez raison, je ne pensais pas beaucoup à propos de cette ligne que je voulais juste vous donner l'exemple suivant: par exemple – Jeremy

0

Étant donné que l'élément a de nombreuses évaluations et que l'association ne connaît pas l'ID utilisateur. Étant donné que l'élément de chaîne d'association aurait un identifiant d'utilisateur, car il appartient à un utilisateur. Et Rating aurait un identifiant d'article parce qu'il appartient à un article. Mais l'assocation Item to Rating ne sait rien d'un utilisateur sauf si vous le lui dites.

1

Si vous avez créé et enregistré l'élément, puis fait une Note de cet article , il ne passerait pas l'utilisateur à la note, non? Vous vous référez à @ rating.item.user, n'est-ce pas?

Si vous y réfléchissez comme cela, vous ne vous attendez pas à ce que l'élément créé via current_user transmette les informations utilisateur à l'évaluation. Je me demande si vous avez vraiment besoin de l'utilisateur has_many relation de notation.

Questions connexes