svergeylen / collector

Collector : site de gestion des BD, films, DVD, jeux de société, ...
2 stars 0 forks source link

Ajout association Polymorphique Tags et Items has_many Tags #54

Closed dvergeylen closed 6 years ago

dvergeylen commented 6 years ago

Ceci modifie le schéma de la database, mais ne migre PAS les données de Series ni Categories vers Tags.

Les tables Series et Categories sont laissées inchangées.

Ceci ne devrait introduire aucune régression avec ce qui fonctionne pour le moment.

:kissing_heart:

dvergeylen commented 6 years ago

J'ai écrit les instructions pour migrer les Series et les Categories vers les Tags. Je pense n'avoir rien oublié.

Evidemment, l'idéal est de tester avant de migrer, voici comment faire:

cd /tmp
git clone https://github.com/dvergeylen/collector dvergeylen-collector
cd dvergeylen-collector/
scp [USER]@[VPS]:[HOME/]collector/db/data.yml db/
bundle install
bundle exec rake db:setup
bundle exec rake db:rollback
bundle exec rake db:data:load
bundle exec rake db:migrate

Ensuite, il faut migrer les valeurs de Serie et Category vers Tags (SANS supprimer ces deux modèles):

# Créer arborescence minimale:
livres            = Tag.create(name: "📚 livres")
bd                = Tag.create(name: "📘 bandes dessinées")
themes            = Tag.create(name: "🏷 thèmes")
auteurs           = Tag.create(name: "🖌 auteurs")
romans            = Tag.create(name: "📕 romans")
voyages           = Tag.create(name: "🏰 ✈ voyages & patrimoines")
bonsais           = Tag.create(name: "🌳 bonsaïs")
livres_techniques = Tag.create(name: "⚙ livres techniques")
livres_beaux      = Tag.create(name: "📗 beaux livres")
series            = Tag.create(name: "✨ séries")

sf = Tag.create(name: "🚀 science-fiction")
hs = Tag.create(name: "🏰 historique")
ph = Tag.create(name: "🤔 philosophie")
so = Tag.create(name: "🌌 space opera")
th = Tag.create(name: "🔎 thrillers")

# Lier les tags entre eux:
livres.tags << [bd, romans, livres_techniques, livres_beaux]
bd.tags     << [series, themes, auteurs]
romans.tags << [themes, auteurs]
themes.tags << [sf, hs, ph, so, th]

# Transfert des Categories et Series vers de nouveaux Tags
adder = User.first

# Tous les Tags dont category_id égale celles de Bande Dessinées (la 'categorie') ou 'Romans'
# sont des tags représentants des auteurs de BD/Romans.
# Ils doivent donc avoir 'auteurs' (tag) pour parent
# et leurs Items doivent avoir le Tag BD/Romans.
category_BD     = Category.find_by(name: "Bandes dessinées")
category_roman  = Category.find_by(name: "Romans")
[[category_BD, bd], [category_roman, romans]].each do |cat, parent_tag|
  Tag.where(category_id: cat.id).each do |auteur|
    auteur.parent_tags << auteurs
    auteur.items.each do |item|
      item.tags << [livres, parent_tag, auteurs, auteur]
      item.adder = adder if item.adder.nil? # Needed bcs of validation
      item.save
    end
  end
end

# Toutes les Séries dont category_id égale celle de Bande Dessinées (la 'categorie')
# doivent être converties en Tag et ceux-ci associés au Tag 'series'.
# Les Items de ces séries doivent recevoir ce nouveau tag également.
category_BD = Category.find_by(name: "Bandes dessinées")
Series.where(category_id: category_BD).each do |serie|
  serie_as_tag = Tag.create(name: serie.name)
  serie_as_tag.parent_tags << series
  serie.items.each do |album|
    album.tags << [series, serie_as_tag]
  end
end

# Toutes les Séries dont category_id égale celle de Romans (la 'categorie')
# doivent être converties en Tag et ceux-ci associés au Tag 'romans'.
# Les Items de ces séries doivent recevoir ce nouveau tag également.
category_roman = Category.find_by(name: "Romans")
Series.where(category_id: category_roman).each do |serie|
  theme_as_tag = Tag.create(name: serie.name)
  theme_as_tag.parent_tags << themes
  theme_as_tag.save
  serie.items.each do |roman|
    roman.tags << [themes, theme_as_tag]
  end
end

# Toutes les Séries dont category_id égale celle de Voyages&Patrimoine (la 'categorie')
# doivent être converties en Tag et ceux-ci associés au Tag 'voyages'.
# Les Items de ces séries doivent recevoir ce nouveau tag également.
category_vp = Category.find_by(name: "Voyages et patrimoine ")
Series.where(category_id: category_vp).each do |serie|
  tag = Tag.create(name: serie.name)
  tag.parent_tags << voyages
  tag.save
  serie.items.each do |item|
    item.tags << [voyages, tag]
  end
end

# Toutes les Séries dont category_id égale celle de Bande Dessinées (la 'categorie')
# doivent être converties en Tag et ceux-ci associés au Tag 'series'.
# Les Items de ces séries doivent recevoir ce nouveau tag également.
category_livres_tech = Category.find_by(name: "Livres techniques")
Series.where(category_id: category_livres_tech).each do |serie|
  tag = Tag.create(name: serie.name)
  tag.parent_tags << livres_techniques
  tag.save
  serie.items.each do |item|
    item.tags << [livres, livres_techniques, tag]
  end
end

# Toutes les Séries dont category_id égale celle de Bonzaï (la 'categorie')
# doivent être converties en Tag et ceux-ci associés au Tag 'bonzais'.
# Les Items de ces séries doivent recevoir ce nouveau tag également.
category_bonzais = Category.find_by(name: "Bonsais")
Series.where(category_id: category_bonzais).each do |serie|
  bonsai_as_tag = Tag.create(name: serie.name)
  bonsai_as_tag.parent_tags << bonsais
  bonsai_as_tag.save
  serie.items.each do |item|
    item.tags << [bonsais, bonsai_as_tag]
  end
end

J'ai TOUT testé, normalement tout marche. A ce stade, Series et Category deviennent redondants, il faut alors adapter les vues pour créer de bonnes combinaisons de tags quand on enregistre des BD / Romans / Series etc...

svergeylen commented 6 years ago

Wow ! Je regarderai à mon retour en Belgique ! :-)

svergeylen commented 6 years ago

ok, j'ai plus ou moins compris l'idée d'avoir des tags dans des tags, mais peux-tu faire ceci pour que je comprenne :

Questions à clarifier pour avancer :

dvergeylen commented 6 years ago
  • dessiner tag/ownertag/items/etc pour voir les relations parce que je vois pas trop

1) Item ↘ has_many :ownertags (as owners) → has_many 3. Tags 2) Tag ↗

Ownertags est composé de:

owner_id/owner_type (polymorphic), tag_id

Donc:

C'est un self-join, dont le parent (owner) est un polymorphic (Tag ou Item)!

  • pourquoi ne pas upprimer series et catégories d'abord pour épurer le bazard ?

Il faudrait, mais je ne suis pas un cowboy! :laughing: .

Je te réponds au reste dès que j'ai le temps

svergeylen commented 6 years ago

transféré dans dev. closed