2010-11-26 36 views
0

Je travaille sur le site QA où j'ai un modèle de question et un modèle de réponse et l'association entre eux est commeplusieurs associations entre le même modèle dans Rails

class Question < ActiveRecord::Base 
    has_many :answers 
end 

Mon modèle réponses est

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 

Maintenant, j'ai besoin de créer une autre association entre question et réponse où je peux accéder à la réponse que l'auteur de la question trouve le meilleur. Donc ce que je besoin est quelque chose comme

class Question < ActiveRecord::Base 
    has_many :answers 
    has_one :accepted_answer, :class_name => 'Answer', :foreign_key => ['answer_id, accepted'] 
end 

Cette association ne parvient pas à juste titre que je n'ai aucun moyen de préciser que je me attends accepté d'être vrai et j'obtiens une erreur MySQL. Existe-t-il un moyen que je peux obtenir cela pour travailler tout en utilisant un booléen comme clé étrangère composite?

MySQL server version for the right syntax to use near '["answer_id", "accepted"] = 30) LIMIT 1' at line 1: SELECT  `answers`.* FROM  `answers` WHERE  (`answers`.["answer_id", "accepted"] = 30) 

La solution que j'ai actuellement utilisé est la création d'une association de réponses à la question comme suit

class Answer < ActiveRecord::Base 
    belongs_to :question 

    has_one :inverse_accepted_answer, :class_name => 'Question', :foreign_key => 'accepted_id' 

end 

et pour la question comme

Class Question < ActiveRecord::Base 
belongs_to :answer, :foreign_key => 'accepted_id' 
has_many :answers 
end 

Le problème est dans ce cas je avoir accès à la réponse sélectionnée sous Question.find (10) .answer au lieu d'utiliser un nom plus expressif que selected_answer.

Y a-t-il un moyen de définir un nom pour la relation de la partie belongs_to. Deuxièmement, quelle serait la bonne façon d'y parvenir? Je technique semble arrondir au sujet de corriger

J'utilise Rails 3 et Ruby 1.9.2

Merci à l'avance

Répondre

1

Qu'en est-il quelque chose comme ça:

has_one :accepted_answer, :class_name => 'Answer', :conditions => "accepted = true" 
+0

Il semble que devrait faire la tour. Génial, je n'y avais jamais pensé. – Sid