2010-07-15 5 views
0

Je maintiens une application rails 2.1 qui a quelques choix malheureux pour les noms de colonnes. Par exemple, un événement a une date de début et une date de fin. Au lieu d'utiliser start_at et end_at la conception originale utilise start et end. Bien sûr, cela conduit àen utilisant end comme nom de colonne

def end 
    read_attribute(:end) || 1.hour.from_now 
    end 

Je suis surpris que même analyse. Est-ce que c'est légal? Le vrai problème est que erb est en train d'exploser avec 'stack level too deep' lors de l'exécution d'un job backgroundrb pour envoyer les e-mails de rappel. Le modèle est

<%= [@event.name, @event.when_pretty, @event.location, @event.association, 
@event.notes].reject(&:blank?) * "\n" %> 

Si je deliver_reminder dans la console il n'y a pas d'erreur, mais quand deliver_reminder est appelé pendant le travail de fond, l'erreur se produit. Question: Devrais-je refactoriser pour supprimer la méthode end, ou l'erreur de pile est-elle causée par quelque chose d'autre?

ligne n ° 1 de foo/Mailer/reminder.rhtml

1: <%= [@event.name, @event.when_pretty, @event.location, @event.association, @event.notes].reject(&:blank?) * "\n" %> 

lib/virtual_attributes_and_associations.rb:59:in `virtual_attribute_names' 
lib/virtual_attributes_and_associations.rb:83:in `read_attribute_without_virtual' 
lib/virtual_attributes_and_associations.rb:86:in `read_attribute' 
vendor/rails/activerecord/lib/active_record/base.rb:2720:in `send' 
vendor/rails/activerecord/lib/active_record/base.rb:2720:in `clone_attribute_value' 
vendor/rails/activerecord/lib/active_record/dirty.rb:127:in `write_attribute' 
vendor/rails/activerecord/lib/active_record/attribute_methods.rb:211:in `data=' 
lib/virtual_attributes_and_associations.rb:9:in `included' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:177:in `call' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:177:in `evaluate_method' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:161:in `call' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:93:in `run' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `each' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `send' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `run' 
vendor/rails/activesupport/lib/active_support/callbacks.rb:272:in `run_callbacks' 
vendor/rails/activerecord/lib/active_record/callbacks.rb:298:in `callback' 
vendor/rails/activerecord/lib/active_record/base.rb:1450:in `send' 
vendor/rails/activerecord/lib/active_record/base.rb:1450:in `instantiate' 
vendor/rails/activerecord/lib/active_record/base.rb:582:in `find_by_sql' 
vendor/rails/activerecord/lib/active_record/base.rb:582:in `collect!' 
vendor/rails/activerecord/lib/active_record/base.rb:582:in `find_by_sql' 
vendor/rails/activerecord/lib/active_record/base.rb:1341:in `find_every' 
vendor/rails/activerecord/lib/active_record/base.rb:1376:in `find_one' 
vendor/rails/activerecord/lib/active_record/base.rb:1362:in `find_from_ids' 
vendor/rails/activerecord/lib/active_record/base.rb:537:in `find' 
vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb:44:in `find_target' 
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:196:in `load_target' 
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:99:in `reload' 
vendor/rails/activerecord/lib/active_record/associations.rb:1084:in `contact' 
lib/association.rb:52:in `associated_object' 
lib/association.rb:48:in `association' 
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:177:in `send' 
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:177:in `method_missing' 
app/views/foo/mailer/reminder.rhtml:1:in `_run_erb_47app47views47foo47mailer47reminder46rhtml' 
+0

Je ne sais pas grand-chose à ce sujet, mais je crois que vous pouvez donner certaines colonnes "alias" afin que vous puissiez renommer cela en 'end_at' pour Active Record – Earlz

Répondre

0

Il s'avère que la question était une méthode de bibliothèque appelée association, quand j'ai changé que pour appeler associated_object (qui a été appelé par l'Association # association), l'erreur de pile ne s'est plus produite.

Questions connexes