Ouverture de session

Commentaires récents

Syndication
Flux XML

Comment copier un enregistrement avec ses relations (HABTM)

Comment copier un enregistrement avec ses relations (HABTM)
Posté par iUser59 le Lundi, 28 Juillet, 2008 - 3:35pm. Développement

Bonjour@Tous,

J'aurais voulu savoir s'il était possible de copier un enregistrement avec ses liaisons simplement en rails.

Je m'explique,

J'ai deux DB avec le même schéma. Dans une DB j'ai une vidéo qui peut avoir plusieurs versions d'OS et une version d'OS qui peut avoir plusieurs vidéos. J'ai donc une relation HABTM.

Je voudrais copier une vidéo de la DB1 dans la DB2. Pour la copie de la vidéo pas de PB j'ai fait

video = Video.find_by_id(808, :include => :osversions)
new_video = Site1::Video.create video.attributes

Jusque là pas de pb, la vidéo est bien copiée dans la DB2. Maintenant, je voudrais savoir s'il existe un moyen de faire simple pour copier dans la DB2 toutes les dépendances de la vidéo (dans ce cas copier la table osversions_videos avec les enregistrements correspondants à la vidéo recherchée et la table Osversions - même si cela ne pose pas de pb - )

D'avance merci



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
La methode clone de la
Auteur: 
dam5s
Date: 
Lun, 28/07/2008 - 21:12

La methode clone de la classe ActiveRecord::Base devrait etre override pour faire ca.

Il n'y a pas de methode simple et universelle pour dupliquer des relations entre objet c'est pour ca que la methode clone de base ne duplique que l'objet. A toi d'ecrire la methode clone pour dupliquer egalement les relations.


def Video < AciveRecord::Base

  has_and_belongs_to_many :os_versions

  def clone
    video_copy = super
    video_copy.save(false)
    self.os_versions.each do |version|
      video_copy.os_versions << version
    end

    video_copy
  end

end

dans ton controller:


copy = video.clone

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci pour cet élément de
Auteur: 
iUser59
Date: 
Mar, 29/07/2008 - 09:45

Merci pour cet élément de réponse. Petite question, est-ce que en utilisant le même id de la table de la DB1 dans la table de la DB2, c'est possible?
J'ai essayé de récupérer l'ID de la table de la DB1, désactiver l'incrémentation auto dans la table de la DB2 et faire new_video.id = video.id (lorsque je fais un puts, ça m'affiche bien le même résultat) mais la valeur n'est pas prise en compte dans la DB2 et elle reste à NULL. Pourtant, j'ai bien fait un new_video.save! juste après mais rien à faire cette valeur reste à NULL. Une IDÉE????


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Je ne crois pas qu'on puisse
Auteur: 
dam5s
Date: 
Mar, 29/07/2008 - 09:57

Je ne crois pas qu'on puisse affecter une id manuellement. Il faudrait regarder la doc d'active record pour ca.

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Et bien je pense que je vais
Auteur: 
iUser59
Date: 
Mar, 29/07/2008 - 13:55

Et bien je pense que je vais devoir créer une colonne avec un id_db1 mais il faudrait que je puisse dire à HABTM que la clé n'est pas l'id de vidéo mais l'id_db1. Comment est-ce faisable?


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Auteur: 
dam5s
Date: 
Mer, 30/07/2008 - 08:14

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001325

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci beaucoup pour ce lien
Auteur: 
iUser59
Date: 
Mer, 30/07/2008 - 09:05

Merci beaucoup pour ce lien vers l'API, je cherchais justement après ça mais je cherchais mal. Je vais tenter de ce pas et je suis sûr (j'espère) que ça va fonctionner. Je vous tiens au courant ;)


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Bizarre Bizarre
Auteur: 
iUser59
Date: 
Mer, 30/07/2008 - 15:40

C'est vraiment bizarre,
J'ai créé une colonne id_master dans ma table dans la DB2 sur laquelle j'ai apppliqué set_primary_key dans le model

Cependant, je n'arrive pas à enregistrer dans la base l'id_master.

new_video = Site1::Video.create video.attributes
new_video.id_master = video.id
new_video.save

et lorsque je fais un tour dans la base de données, ça m'écrit à chaque fois NULL pour cette colonne
Qu'est-ce que je fais de mal?

edit : Non en fait j'ai juste remplacé create par new et là l'id_master est bien le bon. Par contre ça ne résoud toujours pas le problème de copies des relations HABTM


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Un peu d'aide?
Auteur: 
iUser59
Date: 
Mer, 30/07/2008 - 16:05

J'ai toujours cette erreur,
undefined method `_parent_record_id=' for #
lorsque je veux faire une copie des liaisons HABTM. Pourtant j'ai bien mis dans mon model set_primary_key "id_master"

Quelqu'un saurait-il d'où vient mon pb exactement?


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Hum un petit bout de code
Auteur: 
dam5s
Date: 
Jeu, 31/07/2008 - 08:46

Hum un petit bout de code peut-etre ?

http://pastie.caboo.se/ si tu as las flemme de le mettre en forme ici.

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
C'est bon j'ai trouvé. J'ai
Auteur: 
iUser59
Date: 
Jeu, 31/07/2008 - 10:03

C'est bon j'ai trouvé.
J'ai fait
new_video = Site1::Video.new video.attributes
au lieu de
new_video = Site1::Video.create video.attributes

Ce qui m'a permis d'ensuite faire
new_video.id_master = video.id
et de pouvoir le sauvegarder

Concernant la sauvegarde des HABTM, j'ai fait cela
video.osversions.each do |v|
new_video.osversions


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Qui est en ligne
Il y a actuellement 1 utilisateur et 27 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Propulsé par Drupal ]