2009-02-04 6 views
1

J'ai une base de données existante avec un tas de colonnes bêtement nommé comme:Rails ActiveRecord: automatiquement Alias ​​/ Append Suffixe?

some_field_c 
some_other_field_c 
a_third_field_c

Je voudrais bien faire une sous-classe Rails ActiveRecord que les alias automatiquement ces attributs à leur nom moins le trait de soulignement et "c". Cependant, quand j'ai essayé:

attributes.each_key do | key | 
    name = key 
    alias_attribute key.to_sym, key[0, (key.length -2)].to_sym if key =~ /_c$/ 
end 

dans ma définition de la classe, je suis une « variable locale définie ou méthode` attributs » erreur. J'ai également essayé d'écraser ces méthodes:

method_missing 
respond_to?

mais j'ai continué à recevoir des erreurs avec cette route aussi.

Donc, ma question (en fait des questions) est/sont:

  1. Est-ce que je suis en train de faire encore possible?
  2. Si oui, quelle est la meilleure façon de le faire (méthode d'écrasement itératif ou d'écrasement manquant)?
  3. Si ce n'est pas trop de problèmes, un très court exemple de code sur la façon de faire # 2 serait génial.

Merci d'avance pour toutes les réponses que ce poste reçoit.

+0

Pouvez-vous poster un exemple complet cela devrait être assez facile à faire fonctionner –

Répondre

2

Votre problème est probablement que attributes est une méthode d'instance et vous le faites dans le contexte de la classe. La méthode de classe la plus proche de ce que vous voulez est column_names.

+0

Ça a marché, merci! J'ai dû mettre le code dans une méthode qui a été appelée par la sous-classe pour qu'elle fonctionne, et cela aurait été bien si au lieu de cela il y avait un moyen de dire "Exécuter ce code de ré-aliasing juste après tout sous- création d'attributs de classe se produit ", mais * hausser les épaules * oh bien. Merci encore! – machineghost

+0

J'ai essayé de coller mon code de travail ici, mais le formatage du commentaire l'a ruiné :-(Cependant, c'était essentiellement le même code que dans ma question, sauf avec "column_names" au lieu de "attributes", et "(cette ligne était ordures), tous définis dans une méthode qui est appelée par la sous-classe. – machineghost

1

vous pourriez faire quelque chose comme:

methods.each do |method| 
    if method.ends_with("_c") then 
    self.send(:defind_method,method.slice(0,-2)){self.send(method)} 
    end 
end 
1

Hmm ... Je mijoté cette petite solution que je pensais fini assez élégamment ...

Je ne sais pas si cela va fonctionner, mais je crénelage method_missing pour permettre encore active_record de le faire est thang:

module ShittyDatabaseMethods 
    alias :old_method_missing :method_missing 

    def method_missing(method) 
    if methods.include?("#{method}_c") 
     send("#{method}_c".to_sym) 
    else 
     old_method_missing(method) 
    end 
    end 

end 

class Test 
    attr_accessor :test_c 
    include ShittyDatabaseMethods 
end 

vous ne pouvez pas obtenir le nom de votre module « ShittyDatabaseMethods », mais vous voyez l'idée;) Une fois que vous définissez ce module et d'autres choses i t dans lib, il vous suffit d'inclure ce module et c'est parti: D

aimerais entendre si cela fonctionne pour vous :)

+0

Merci, mais malheureusement, cela ne fonctionne pas :-(Si je fais quelque chose comme my_shitty_object.some_attribute = 5 que devient un appel de méthode à "some_attribute =", si vous ajoutez "_c" à ce que vous obtenez "some_attribute = _c" comme nom de votre méthode, au lieu de "some_attribute_c =". – machineghost

+0

Ah, c'est vrai. Bonne prise :) –

Questions connexes