# README Commandes lancées : Question 2.2 : * `rails server` Question 2.3 : * `rails generate controller HomeController` Question 3 : * `rails generate model Creature name:string health_points:integer` * La migration n'est pas lancée sur la base * `rails db:migrate` Question 3.1 : Je teste la creature dans une console rails que je lance avec `rails console` : ```ruby ❯ rails console Loading development environment (Rails 7.0.4.3) irb(main):001:0> c = Creature.create(name: "Thrall", health_points: 489) TRANSACTION (0.1ms) begin transaction Creature Create (0.4ms) INSERT INTO "creatures" ("name", "health_points", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Thrall"], ["health_points", 489], ["created_at", "2023-03-26 13:19:57.492017"], ["updated_at", "2023-03-26 13:19:57.492017"]] TRANSACTION (0.9ms) commit transaction => # c.to_label => "Thrall (489)" ``` Question 3.2 : * `bundle add random_name_generator` pour ajouter la gemme au gemfile, effectuer la résolution de dépendance et installer la nouvelle gemme * `rails db:seed` ## TP4 Question 2.5 : * J'ajoute une créature avec des PVs à 0 : ```ruby ❯ rails console Loading development environment (Rails 7.0.4.3) irb(main):001:0> Creature.create(name: 'Zombie', health_points: 0) TRANSACTION (0.1ms) begin transaction Creature Create (0.4ms) INSERT INTO "creatures" ("name", "health_points", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Zombie"], ["health_points", 0], ["created_at", "2023-03-26 14:00:56.413028"], ["updated_at", "2023-03-26 14:00:56.413028"]] TRANSACTION (0.9ms) commit transaction => # ``` * J'essaie de renommer la créature dans postman et je vérifie que son nom ne change pas * J'ai bien une 404 et son nom n'a pas changé Question 2.6 : * Je génère la migration avec `rails g migration AddSizeColumnToCreatures size:integer` * `rails db:migrate` * J'ajoute le callback comme dans le sujet du TP pour setter la size à la création, je teste en console : ```ruby irb(main):001:0> Creature.create(name: 'Big Chongus', health_points: 25) TRANSACTION (0.1ms) begin transaction Creature Create (0.4ms) INSERT INTO "creatures" ("name", "health_points", "created_at", "updated_at", "size") VALUES (?, ?, ?, ?, ?) [["name", "Big Chongus"], ["health_points", 35], ["created_at", "2023-03-26 14:07:03.876318"], ["updated_at", "2023-03-26 14:07:03.876318"], ["size", 2]] TRANSACTION (0.6ms) commit transaction => # ``` Toutes les créatures crées auront dorénavant une taille. Maintenant il faut faire une migration pour mettre à jour celles en base. * `rails g migration SetSizeOnCreatures` * Après avoir écrit la mise à jour, j'applique avec : `rails db:migrate` * Je teste en console en regardant une vieille créature : ```ruby irb(main):012:0> Creature.first Creature Load (0.5ms) SELECT "creatures".* FROM "creatures" ORDER BY "creatures"."id" ASC LIMIT ? [["LIMIT", 1]] => # ``` Question 3 : * Je génère la migration pour ajouter les combats avec : `rails g migration CreateCombat result:integer name:string left_fighter:references right_fighter:references winner:references` Cette migration sera pré-chargée avec : ```ruby class CreateCombat < ActiveRecord::Migration[7.0] def change create_table :combats do |t| t.integer :result t.string :name t.references :left_fighter, null: false, foreign_key: true t.references :right_fighter, null: false, foreign_key: true t.references :winner, null: false, foreign_key: true t.timestamps end end end ``` Il va falloir préciser vers quelle table doit pointer la foreign key, pour ça on remplace `foreign_key: true` par `foreign_key: { to_table: 'creatures' }`. On remplacera aussi le `null: false` de la référence `winner` pour supporter de ne pas en avoir. Question 3.1 : On ajoute la méthode baston! sur les combats et on teste en console. La méthode modifie les instances de créature mais ne sauvegarde pas. Pour une domination : ```ruby ❯ rails console Loading development environment (Rails 7.0.4.3) irb(main):001:0> c1 = Creature.first ... irb(main):003:0> c1.to_label => "Thrall (489)" irb(main):004:0> c2 = Creature.last ... irb(main):005:0> c2.to_label => "Big Chongus (35)" irb(main):006:0> combat = Combat.new(name: "L'orc vs le lapin", left_fighter: c1, right_fighter: c2) => # irb(main):007:0> combat.baston! => :domination irb(main):008:0> combat.winner => # irb(main):009:0> combat.right_fighter => # ``` Pour un draw : ```ruby irb(main):011:0> c2.reload # permet de recharger le record depuis la base ... => # irb(main):012:0> c3 = Creature.create!(name: "Big Chungus", health_points: 35) ... irb(main):013:0> combat2 = Combat.new(name: "Le fake vs le vrai", left_fighter: c2, right_fighter: c3) => # combat2.baston! => :draw irb(main):015:0> combat2.winner => nil irb(main):016:0> c2.to_label => "Big Chongus (0)" irb(main):017:0> c3.to_label => "Big Chungus (0)" ```