Association relfexive one-to-one

Salut,

Je suis en train de faire une petite appli de style blog, qui gere des
articles en français avec leur traduction anglaise.

Je pensais faire une table articles dans laquelle un article en
référence un autre se situant dans la même table (association
reflexive). Ainsi, on peut indifférement créer un article en anglais
puis le traduire en français et inversement. un attribut différenciera
biensur la langue des deux articles.

Est ce la bonne approche pour ce type de problème ? Je n’ai pas trouvé
de documentation sur les associations de ce type :frowning:

Merci pour vos avis.

A mon avis tu ferais bien de regarder du côté du plugin Globalite (il y
en a
plein d’autres qui gèrent l’internationalisation, mais franchement c’est
celui que j’ai trouvé le plus sympa à travailler avec).

http://www.railsontherun.com/globalite

Cordialement


Michel B.

Merci pour la réponse,

J’avais un peu regardé du coté de globalize mais j’avais trouvé ça un
peu usine à gaz pour mon utilisation, globalite me semble parfait :slight_smile:
merci bien

Je crois que globalite peut le faire aussi, mais pour l’instant je n’ai
pas
eu d’occasion de l’utiliser à ces fins.

On 1 juil. 08, at 10:28, Michel B. wrote:

A mon avis tu ferais bien de regarder du côté du plugin Globalite
(il y en a plein d’autres qui gèrent l’internationalisation, mais
franchement c’est celui que j’ai trouvé le plus sympa à travailler
avec).

Si j’ai bien compris le fonctionnement de globalite, il est utile pour
faire l’internationalisation de l’interface, pas du contenu de la BDD
(là c’est plus le rôle de globalize justement).
Donc c’est pas vraiment ce que veux Albaran

Arthur PETRY

Il faut bien avouer que globalize, ça fait un peu peur…

A ma connaissance, globalite n’apporte pas de solution
d’internationalisation du contenu de la base de données, mais je me
trompe
peut-être … Je crois que Matt Aimonetti lit la liste, peut-être qu’il
pourra nous répondre :slight_smile:
En tout cas si c’est le cas, ça m’intéresse !!! Je redoute un peu de
devoir
passer à globalize uniquement pour cette problématique …

Emmanuel

Le 1 juillet 2008 20:36, Michel B. [email protected]
a
écrit :

Michel B. wrote:

Il faut bien avouer que globalize, ça fait un peu peur…

C’est vrai qu’en allant sur le site de globalize ouch, je me suis dit
que c’était pas pour moi.

J’ai décidé d’utiliser globalite pour la partie ui, et je suis en train
de faire la partie traduction du contenu des articles comme j’avais
prévu : une table Posts avec un post_id en clé étrangére, le tout avec
un belongs_to :translation.
(association réfléxive). Ca me permet d’associer un article fr à une
traduction en et inversement.

Je pense pas avoir besoin de plus étant donné que mon appli est
uniquement bilingue. Peut être que ma solution n’est pas la meilleure
(des conseils de pro :wink: ?)

Merci pour vos réponses !!

Michel B. wrote:

Moi, du moment que tu le sens comme ça, je ne vois pas de problème.

Encore une derniere question, j’ai fait mon association reflexive de
cette façon :

class Post < ActiveRecord::Base
belongs_to :translation, :class_name => ‘Post’, :foreign_key =>
‘post_id’
end

Chose qui me parait bizarre d’après ce que j’ai lu : quand je fais sur
un post p déjà existant un p.create_translation(:attribut => ‘valeur’),
la clé etrangère post_id n’est pas remplie automatiquement ?

Ne devrait elle pas avoir la valeur de l’id de p ? Ai-je manqué
quelquechose ?

J’ai pas bien compris la question là …

Le 2 juillet 2008 11:17, Albaran M. [email protected] a
écrit :

end


Michel B.

Moi, du moment que tu le sens comme ça, je ne vois pas de problème.

Je pensais que grace à un belongs_to, les associations étaient
automatiquement faites entre deux objets.

Si j’appelle la méthode create_translation sur un Post p, alors cela me
créerait un nouveau post ayant comme clé étrangère l’identifiant de p.

C’est assez dur a expliquer clairement :stuck_out_tongue:

belongs_to fait l’association dans un seul sens.
Il faut faire aussi un has_one ou un has_many dans l’autre sens pour que
l’association soit réflexive.

Ah, ben oui, évidemment, si quand tu les crée tu ne les lie pas,
évidemment
ça va marcher beaucoup moins bien…

N’oublie pas de préciser quelle est la :translation_id du second quand
même.

Ensuite, tu donne le même nom (:translation) aux deux côtés de ta
relation,
ça entraîne une ambigüité.

Enfin, à ta place je dirais plutôt :original_id, parce que c’est mieux
que
la traduction ait l’id de l’original, plutôt que l’inverse.

Ca donnerai quelque chose du goût :

  • dans ta migration
    t.integer :original_id
  • dans ton model
    belongs_to :original, :class_name => :post, :foreign_key =>
    :original_id
    has_one :translation, :class_name => :post, :foreign_key =>
    :original_id

Là ça devrait faire ce que tu veux.

Michel B. wrote:

belongs_to fait l’association dans un seul sens.
Il faut faire aussi un has_one ou un has_many dans l’autre sens pour que
l’association soit réflexive.

J’ai essayé avec un has_one en +, et je n’arrive toujours pas au
résultat escompté :
ma classe Post simplifiée :

class Post < ActiveRecord::Base
has_one :translation,:class_name => “Post”,:foreign_key
=>“translation_id”
belongs_to :translation,:class_name => “Post”,:foreign_key =>
“translation_id”
end

Migration :
t.string :title
t.integer :translation_id

et enfin le résultat d’une session console :

p = Post.create(:title => “Titre de p”)
=> #<Post id: 4, title: “Titre de p”, translation_id: nil>

t = p.create_translation(:title => “Titre de t”)
=> #<Post id: 5, title: “Titre de t”, translation_id: nil>

Est ce le comportement normal ou est ce que t devrait avoir un
translation_id égal à 4 ? Sinon je vois pas trop l’intéret de la méthode
create_translation générée automatiquement ?

Wow, effectivement j’étais plutot à coté de la plaque. J’avais pas
réellement conçu la chose dans ma tête de la même façon. Donc maintenant
grace à toi ça marche bien. Un article original quelle que soit sa
langue aura un original_id nul, et je peux leur créer une traduction
avec create_translation, nikel !

Merci BEAUCOUP pour votre aide :):slight_smile:

And another satisfied customer ^^