Talvolta la classe padre non carica tutti i relativi figli in una richiamata after_save
da parte del figlio.Associazione di rail non caricata correttamente
Ho due modelli:
class Parent < ActiveRecord::Base
has_many :children
def update_something
# explained below
end
end
class Child < ActiveRecord::Base
belongs_to :parent
after_save :tell_parent_to_update
def tell_parent_to_update
parent.update_something
end
end
ho un test di Io corro su di esso, che ha appena controlla 2 cose. parent.children.count
e parent.children.length
. Entrambi dovrebbero essere 4. Mi rendo conto che il conteggio a volte è diverso, ma (per quanto ne so) non dovrebbe essere qui.
Se io definisco update_something
di iterare poco più children
:
def update_something
children.each do |child|
end
end
il test fallisce - il ciclo verrà eseguito una volta (e tornerà la matrice di un singolo bambino - la prima child
creato) .
Altrimenti, posso inserire qualsiasi codice purché non menzioni children
e funzionerà. È come se la chiamata ai bambini stia causando l'associazione a caricare la cosa sbagliata.
Forzare una ricarica ripara:
def update_something
children(true).each do |child|
end
end
ma questo è hacky e avrei preferito risolvere il problema principale, se possibile.
È questo il mio bug, o un baco (e se è così c'è qualcosa che posso fare per aggirare questo)?
Dubito che importi ma questo è un ambiente di test che utilizza sqlite3. Anche se fallirà in un ambiente di sviluppo se creo e collaudo i record in una singola sessione di console di sviluppo.
'children.each do | child |' or 'Children.each do | child |'? –
forse qualcosa a che fare con le parole chiave, solo a indovinare. – Nithin
L'ho pensato anch'io all'inizio, ma nel codice reale ora è molto isolato e i nomi effettivi dei modelli/metodi sono estremamente specifici del dominio e sfortunatamente non sono parole chiave. –