2009-07-21 11 views
1

Je travaille sur une base de données héritée qui est complètement non-sens. J'ai une table appelée film qui contient des colonnes avec des noms comme c00, c01, c02 et ainsi de suite. La table utilise également des clés primaires non standard. J'ai donc créé une classe appelée film comme celui-ci:Comment remplacer les associations de colonnes d'attributs par défaut d'enableecord?

class Movie < ActiveRecord::Base 
    set_table_name "movie" 
    set_primary_key "idMovie" 

    belongs_to :media_file, :foreign_key => "idFile" 

    def title 
    self.c00 
    end 

    def plot 
    self.c01 
    end 
end 

Je voudrais pouvoir faire quelque chose comme Movie.find_by_title (« Die Hard ») et faites-le retourner le bon résultat. Aussi, j'aimerais pouvoir dire Movie.create (: title => "Die Hard"). Comment puis-je faire cela?

Répondre

0

Vous avez vraiment juste besoin d'une combinaison de Sarah's answer et Ben's answer:

class Movie < ActiveRecord::Base 

    # gives you Movie.find_by_title 
    # and lets you chain with other named scopes 
    named_scope :find_by_title, lambda { |title| { :conditions => { :c00 => title } } } 

    # gives you 
    # movie.title 
    # movie.title=(title) 
    # and 
    # Movie.new(:title => title) 
    alias_attribute :title, :c00 

end 
+0

Merci, c'est parfait! – nixterrimus

1

Je pense que vous voulez alias_attribute. Découvrez Brian Hogan's excellent presentation de RailsConf cette année.

+0

Excellent! Cela supprime le besoin de méthodes définissant les accesseurs et les mutateurs, mais ne permet pas la recherche par l'alias. Movie.find_by_title ("Die Hard") ne fonctionne toujours pas. – nixterrimus

0

Les méthodes find_by_ * utilisent la réflexion, ce qui n'est pas le cas avec Rails prêtes à l'emploi. Vous pouvez, bien sûr, de définir vos propres méthodes:

def self.find_by_title(title) 
    first(:conditions => { :c00 => title }) 
end 

L'étape suivante consisterait à itérer sur un hachage de column_aliases => real_columns à utiliser comme fourrage pour les appels à alias_attribute et define_method.

Questions connexes