2013-10-09 4 views
6

je le has_many travail suivant avec un proc pour capturer un paramètre pour le contexte:Rails Convertir 4 has_many de la condition avec proc où

has_many :subclass_point_analytics, :conditions => proc {"assessment_id = #{self.send(:assessment_id)}" }, :foreign_key => 'gid', :dependent => :destroy 

J'utilise Rails 4 et il est (à juste titre) se plaindre de l'utilisation de: conditions. Après 30 minutes et beaucoup d'essais je n'arrive pas à comprendre comment convertir: conditions au format -> {where ...}. J'apprécierais quelqu'un avec la connaissance de la syntaxe de proc pour m'aider à le corriger.

+0

Avez-vous trouvé une solution à votre problème? – Thomas

Répondre

15

Il suffit de faire ceci:

has_many :subclass_point_analytics, -> (object) { where("assessment_id = ?", object.assessment_id) }, :foreign_key => 'gid', :dependent => :destroy 
objet

est votre instance réelle. Aussi, attention: l'appelable doit être la première chose (: les conditions ont tendance à être à la fin)

+0

A travaillé parfaitement pour moi. Suggérer également de renommer la variable 'objet' en plus de nom spécifique au domaine. – raeno

+1

Je veux juste ajouter que j'ai utilisé ceci encore et encore là où c'était "nécessaire" et cela a fonctionné comme un charme. Merci @Thomas pour la réponse. – TJChambers

+0

comment faire cela dans les rails 3.2? –

0

Je commence par quelque chose comme ceci:

has_many :subclass_point_analytics, -> { where("assessment_id = #{self.send(:assessment_id)}") }, :foreign_key => 'gid', :dependent => :destroy 
+0

C'est là que j'ai commencé aussi, mais comme il manque l'élément proc, ça ne marche pas. Ma question est de savoir comment conserver l'élément proc lors de la conversion. – TJChambers

+0

Il semble étrange que le Proc est même nécessaire. Est-il possible que subclass_point_analytics fasse partie du même modèle mais ait plus d'un assessment_id? Si oui, comment les récupéreriez-vous avec l'association? Il semble que ce soit acceptable d'abandonner complètement les conditions. – davidfurber

+0

Il n'est pas possible d'avoir plus d'une évaluation, mais la condition est utilisée car assessment_id dirige la clé primaire et fait partie d'une clé de partition. La différence de performance sans cela est 1000x avec la taille de l'ensemble de données. – TJChambers

Questions connexes