Problème avec les pluriels irréguliers

Bonjour,

J’ai les 2 modèles suivants, ObjectInWorld et Container, définis
comme ceci :

class ObjectInWorld < ActiveRecord::Base
  # Pour cette table la pluralisation automatique n'est pas correcte
  set_table_name "objects_in_world"

  belongs_to :container
[...]
end

class Container < ActiveRecord::Base
  has_many :objects_in_world,
[...]
end

De plus, dans “environnment.rb”, j’ai les lignes :

Inflector.inflections do |inflect|
  inflect.irregular 'object_in_world', 'objects_in_world'
end

Malgré ceci, quand je tape la ligne :

Container.find(1).objects_in_world

j’obtiens l’erreur suivante :

NameError: uninitialized constant Container::ObjectsInWorld

J’ai donc été obligé de modifier le modèle Container comme ceci :

class Container < ActiveRecord::Base
  has_many :objects_in_world,
           :class_name => "ObjectInWorld"

[...]
end

Et là ça fonctionne.

* Est-ce que j'ai fait une erreur et c'est pour cela que ma règle de
  pluriel irrégulier ne fonctionne pas, ou y a-t-il une autre raison 

?
* D’ailleurs j’avais déjà mis un “set_table_name” dans le modèle
ObjectInWorld, pour une raison que j’ai oubliée mais il me
semble que sinon quelque chose ne fonctionnait pas lors de la
migration.

Cordialement,


Farzad FARID / Architecte Open Source - Associé
Pragmatic Source / http://www.pragmatic-source.com
Tel : +33 9 53 19 21 90 / Mob : +33 6 03 70 65 46
Rejoignez mon réseau de contacts :
http://www.viadeo.com/invitationpersonnelle/002ic6twokcvmi

Farzad FARID wrote the following on 15.08.2007 18:50 :

Bonjour,

J’ai les 2 modèles suivants, ObjectInWorld et Container, définis
comme ceci :

Je n’ai jamais eu besoin de modifier les règles d’Inflector, mais j’ai
une suggestion :
pourquoi ne pas nommer ta classe WorldObject ? Je ne connais pas le
contexte, mais a priori ça me semble plus naturel en anglais et
çarentre dans les cases :slight_smile:

Lionel

Lionel B. a écrit :

Je n’ai jamais eu besoin de modifier les règles d’Inflector, mais j’ai
une suggestion :
pourquoi ne pas nommer ta classe WorldObject ? Je ne connais pas le
contexte, mais a priori ça me semble plus naturel en anglais et ça
rentre dans les cases :slight_smile:

J’avais bien pensé qu’on me proposerait cette non-solution, mais j’ai
plutôt envie de connaître le problème :slight_smile: De plus, la table a ce nom pour
des raisons historique (je ne suis pas l’auteur de l’appli originale en
PHP) et je n’ai pas envie de me lancer dans du refactoring à 3j de mes
vacances :wink:

A plus


Farzad FARID / Architecte Open Source - Associé
Pragmatic Source / http://www.pragmatic-source.com
Tel : +33 9 53 19 21 90 / Mob : +33 6 03 70 65 46
Rejoignez mon réseau de contacts :
http://www.viadeo.com/invitationpersonnelle/002ic6twokcvmi

Farzad a écrit :

Malgré ceci, quand je tape la ligne :

Container.find(1).objects_in_world

j’obtiens l’erreur suivante :

NameError: uninitialized constant Container::ObjectsInWorld

Essaie en rajoutant la règle :

inflect.irregular ‘ObjectInWorld’, ‘ObjectsInWorld’

Remarque : la réponse de Lionel était une solution tout à fait
envisageable, qui ne te convenait pas certes, mais certainement
pas une non-solution.

-- Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Bonjour

Jean-François Trân a écrit :

Essaie en rajoutant la règle :
inflect.irregular ‘ObjectInWorld’, ‘ObjectsInWorld’

Merci du conseil, en rajoutant cette règle à celle que j’avais déjà :

inflect.irregular ‘object_in_world’, ‘objects_in_world’

J’ai effectivement résolu mon problème et j’ai pu supprimer tous les
appels à “set_table_name” et autres paramètres supplémentaires que je
devais utiliser sinon.

Remarque : la réponse de Lionel était une solution tout à fait
envisageable, qui ne te convenait pas certes, mais certainement
pas une non-solution.

Je suis bien d’accord. Mais je voulais comprendre la source du problème
sans avoir à renommer le modèle, même s’il a un nom tordu pour des
raisons historiques :slight_smile:

Cordialement,


Farzad FARID / Architecte Open Source - Associé
Pragmatic Source / http://www.pragmatic-source.com
Tel : +33 9 53 19 21 90 / Mob : +33 6 03 70 65 46
Rejoignez mon réseau de contacts :
http://www.viadeo.com/invitationpersonnelle/002ic6twokcvmi