2010-12-12 69 views
7

Comment ActiveRecord déduire la cartographie du singulier (classe) et pluriel (tableau), par exemple:Comment ActiveRecord infère le mappage à partir de singulier (classe) et pluriel (table); et est-il possible de surcharger?

People = Person 
Ducks = Duck 
Geese = Goose 
Categories = Category 

On dirait une bonne idée dans le concept, mais aucune idée si je dois carte singulier (classe) et pluriel (table) instances, ou si ActiveRecord est un peu comment "magiquement" faire cela. De plus, il semble que cela pourrait conduire à plus de frais lorsque vous devez pluraliser un nom qui n'est pas aussi simple que d'ajouter "s".

REMARQUE: Moved la deuxième partie de cette question ici: Does ActiveRecord assign a key to every table using the naming convention “ID”, and if so, why?

+1

Ce sont des questions assez fondamentales à se poser. Il y a beaucoup à savoir sur ActiveRecord, et il est difficile de faire les choses correctement sans avoir lu les bases. Bonne chance. – aceofspades

+1

@fullware: Ce ne sont pas des questions fondamentales, en fait - je ne connais aucun autre système qui pluralise dynamiquement des objets dans le but d'obtenir une sorte de cohésion sémantique; L'anglais lui-même ne pluralisme même pas les choses de manière cohérente. En fait, si je ne parviens pas à trouver une bonne raison de ne pas le faire, je désactive la fonctionnalité en définissant class/table comme "inflect.uncountable"; C'est beaucoup plus facile que de penser à une règle supplémentaire qui ne soit pas basée sur une langue anglaise très incohérente. – blunders

+1

Fondamental à Rails était l'implication ici. Vous pouvez solliciter d'autres avis sur la question de savoir si les fonctionnalités désactivantes faisant partie du "Rails Way" seront bien reçues par d'autres développeurs avec lesquels vous devrez peut-être travailler. Personne n'est satisfait à 100% de la façon dont les choses sont faites, mais personnellement, je finis par regretter quand j'essaie de me battre contre un cadre plutôt que de travailler avec. – aceofspades

Répondre

10

Rails utilise le ActiveSupport :: Inflector pour garder la trace des mots et la façon de les changer. Par exemple, Rails saura mémoriser UserPreference dans user_preferences

Vous pouvez également ajouter vos inflexions à l'inflecteur pour gérer des cas plus étranges où ajouter un s n'a pas de sens.

Dans /config/initializers/inflections.rb vous obtenez les éléments suivants:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.plural /^(ox)$/i, '\1en' 
    inflect.singular /^(ox)en/i, '\1' 
    inflect.irregular 'person', 'people' 
    inflect.uncountable %w(fish sheep) 
end 

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html

+0

+1 Super, merci - fait la question juste une question, et vous sélectionne comme la réponse. Déplacé l'autre question ici: http://stackoverflow.com/questions/4422042/does-activerecord-assign-a-key-to-every-table-using-the-naming-convention-id-a – blunders