2013-10-09 7 views
6

Ho la seguente has_many lavoro con proc per catturare un parametro per il contesto:Rails Converti 4 has_many dalle condizioni con proc dove

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

Sto usando Rails 4 ed è (giustamente) lamentando l'uso di: condizioni. Dopo 30 minuti e un sacco di tentativi non riesco a capire come convertire: condizioni per il formato -> {dove ...}. Gradirei qualcuno con conoscenza della sintassi proc per aiutarmi a ottenere quello corretto.

+0

Hai trovato una soluzione per il tuo problema? – Thomas

risposta

15

solo fare questo:

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

oggetto è l'istanza attuale. Inoltre, attenzione: il callable deve essere la prima cosa (: le condizioni tendono ad essere alla fine)

+0

ha funzionato perfettamente per me. Suggerire inoltre di rinominare la variabile "oggetto" su un nome più specifico del dominio. – raeno

+1

Voglio solo aggiungere che ho usato questo e più volte dove era "necessario" e funzionava come un fascino. Grazie a @Thomas per la risposta. – TJChambers

+0

come farlo in rotaie 3.2? –

0

mi piacerebbe iniziare con qualcosa di simile:

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

Ecco da dove ho iniziato anch'io, ma dal momento che manca l'elemento proc, non funziona. La mia domanda è come mantenere l'elemento proc durante la conversione. – TJChambers

+0

Sembra strano che il Proc sia addirittura necessario. È possibile che subclass_point_analytics appartenga allo stesso modello ma abbia più di un assessment_id? Se è così, allora come li recupereresti con l'associazione? Sembra che dovrebbe essere ok di abbandonare del tutto le condizioni. – davidfurber

+0

Non è possibile che HANNO più di una valutazione, ma la condizione viene utilizzata come assessment_id sta conducendo la chiave primaria e fa parte di una chiave di partizione. La differenza di prestazioni senza di essa è 1000x con la dimensione del set di dati. – TJChambers