2010-11-03 14 views
1

Comme sur StackOverflow, il y a une question et cette question a beaucoup de réponses.
Mais une seule des réponses est marquée comme acceptée.
Comment implémenter la même chose dans Rails?Rails: Comment modéliser "question a beaucoup de réponses mais une seule réponse acceptée"?

Les modèles et les tableaux que j'ai sont:

class Question < ActiveRecord::Base 
    has_many :answers 
    has_one :accepted_answer # how to get this to work? 
end 
#Table: questions(id,question_text) 

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 
#Table: answers(id, question_id) 

MISE À JOUR (@voldy, merci, mais cela ne semble pas fonctionner!)

I ajouté belongs_to :accepted_answer, :class_name => 'Answer' dans le modèle de question. a ensuite ajouté un accepted_answer_id et couru ce code:

@question = current_user.questions.find(3) 
an_answer = Answer.find(1) #presuming this is the answer i want to accept 
@question.accepted_answer = an_answer 
@question.save! 

Mais le champ accepted_answer_id dans questions table reste nulle? J'ai également essayé avec le nom de champ comme answer_id, mais le même résultat.

+0

Essayez '@question.answer_id = an_answer.id'. Si vous souhaitez utiliser 'accepted_answer_id' au lieu de' answer_id', ajoutez ': foreign_key =>" accepted_answer_id "' à la relation. – Voldy

Répondre

4

Je pense qu'il existe différentes approches. L'un d'eux est d'ajouter answer_id à la table des questions:

class Question < ActiveRecord::Base 
    has_many :answers 
    belongs_to :accepted_answer, :class_name => "Answer", 
           :foreign_key => :answer_id 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 

Quelque part dans la vue if question.accepted_answer == answer etc.

+0

Merci pour votre réponse, j'ai essayé mais ça ne semble pas fonctionner? S'il vous plaît voir la mise à jour à ma question – Zabba

+0

J'ai ajouté ': foreign_key' à la relation. Voir aussi mon commentaire à votre question. Et vous devriez ajouter ce nouveau champ à 'attr_accessible' si vous l'utilisez (je vous encourage à l'utiliser). – Voldy

+0

Super! l'ajout du 'foreign_key' a fait l'affaire. Une question: ne rendrait pas le champ 'attr_accessible' exposé à un risque: quelqu'un pourrait changer la réponse acceptée en envoyant un param à travers le contrôleur? – Zabba