[RUBY] [Mon mémo] Entendons-nous bien avec Pry / DB avec Rails

introduction

Lors de l'utilisation de DB à l'aide de Pry with Rails Laissez les commandes et les idées nécessaires comme vos propres notes.

environnement

MacOS Mojave Ruby 2.6.4 Rails 6.0.3.3 Vue 2.6.12 Webpack 4.44.2 yarn 1.22.5 Docker 2.3.0.5 VScode

Environnement

La construction de l'environnement Vue Rails 6 à l'aide de Docker est résumée ci-dessous. Lien: Comment lier Rails6 Vue (à partir de la construction de l'environnement)

Liés à la migration du modèle et de la base de données

Je vais soulever le conteneur Docker.

python


Docker-compose up

Créer un modèle d'article

python


Docker-compose exec web rails g model Article name:string content:text

Running via Spring preloader in process 207
      invoke  active_record
      create    db/migrate/20200926174356_create_articles.rb
      create    app/models/article.rb
      invoke    test_unit
      create      test/models/article_test.rb
      create      test/fixtures/articles.yml

Commentaire Création d'un modèle

python


Docker-compose exec web rails g model Comment comment:text

Running via Spring preloader in process 276
      invoke  active_record
      create    db/migrate/20200926174846_create_comments.rb
      create    app/models/comment.rb
      invoke    test_unit
      create      test/models/comment_test.rb
      create      test/fixtures/comments.yml

Réflexion dans DB

python


Docker-compose exec web rails db:migrate

== 20200926174356 CreateArticles: migrating ===================================
-- create_table(:articles)
   -> 0.0505s
== 20200926174356 CreateArticles: migrated (0.0519s) ==========================

== 20200926174846 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0296s
== 20200926174846 CreateComments: migrated (0.0310s) ==========================

Vérification de l'état de la base de données

python


Docker-compose exec web rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200926174356  Create articles
   up     20200926174846  Create comments

Version DB

python


Docker_Rails6_Vue hiroki$ Docker-compose exec web rails db:version
Current version: 20200926174846

Vérifiez la version sur Schema.rb

schema.rb


ActiveRecord::Schema.define(version: 2020_09_26_174846) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "articles", force: :cascade do |t|
    t.string "name"
    t.text "content"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "comments", force: :cascade do |t|
    t.text "comment"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

Restauration de la base de données

Si Docker-compose exec web rails db: rollback STEP = 2, il sera [+1] vers le bas.

En d'autres termes Docker-compose exec web rails db:rollback STEP=1 Quand Docker-compose exec web rails db:rollback Est le même

python


Docker-compose exec web rails db:rollback

== 20200926174846 CreateComments: reverting ===================================
-- drop_table(:comments)
   -> 0.0104s
== 20200926174846 CreateComments: reverted (0.0156s) ==========================

Vérification de l'état de la base de données

Il est nécessaire de supprimer le fichier de migration et d'ajouter des colonnes DB au moment de l'arrêt. En règle générale, un fichier de migration est créé et décrit pour ajouter une colonne DB.

python


Docker-compose exec web rails db:migrate:status

database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200926174356  Create articles
  down    20200926174846  Create comments

Docker-compose exec web rails db: migrez et remettez-le.

Lancer Pry

Démarrez Pry

python


Docker-compose exec web rails c

Running via Spring preloader in process 1191
Loading development environment (Rails 6.0.3.3)
[1] pry(main)> 

Créer un nouvel objet article

python


pry(main)> @article = Article.new
=> #<Article:0x0000555d5c5340a8 id: nil, name: nil, content: nil, created_at: nil, updated_at: nil>
pry(main)> 

Mettre une valeur dans l'objet article

python


pry(main)> @article.name = "Article 1"
=> "Article 1"

pry(main)> @article.content = "Le contenu de l'article"
=> "Le contenu de l'article"

L'objet article passe-t-il la validation?

python


pry(main)> @article.valid?
=> true

Enregistrez l'objet article dans la base de données.

python


pry(main)> @article.save!
   (0.5ms)  BEGIN
  Article Create (8.5ms)  INSERT INTO "articles" ("name", "content", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["name", "Article 1"], ["content", "Le contenu de l'article"], ["created_at", "2020-09-26 18:18:00.150412"], ["updated_at", "2020-09-26 18:18:00.150412"]]
   (4.1ms)  COMMIT
=> true

Connectez-vous à postgres.

python


docker-compose exec db psql -U postgres -d myapp_development

psql (12.4 (Debian 12.4-1.pgdg100+1))
Type "help" for help.

myapp_development=# 

Afficher la liste des bases de données

python


myapp_development=# \l
                                     List of databases
       Name        |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-------------------+----------+----------+------------+------------+-----------------------
 myapp_development | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 myapp_test        | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres          | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0         | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                   |          |          |            |            | postgres=CTc/postgres
 template1         | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                   |          |          |            |            | postgres=CTc/postgres
(5 rows)

Afficher le tableau du DB connecté

python


myapp_development=# \d
                  List of relations
 Schema |         Name         |   Type   |  Owner   
--------+----------------------+----------+----------
 public | ar_internal_metadata | table    | postgres
 public | articles             | table    | postgres
 public | articles_id_seq      | sequence | postgres
 public | comments             | table    | postgres
 public | comments_id_seq      | sequence | postgres
 public | schema_migrations    | table    | postgres
(6 rows)

Afficher les colonnes du tableau

python


myapp_development=# \d articles
                                          Table "public.articles"
   Column   |              Type              | Collation | Nullable |               Default                
------------+--------------------------------+-----------+----------+--------------------------------------
 id         | bigint                         |           | not null | nextval('articles_id_seq'::regclass)
 name       | character varying              |           |          | 
 content    | text                           |           |          | 
 created_at | timestamp(6) without time zone |           | not null | 
 updated_at | timestamp(6) without time zone |           | not null | 
Indexes:
    "articles_pkey" PRIMARY KEY, btree (id)

Afficher les données de la colonne du tableau

python


myapp_development=# select * from articles ;
 id | name  |    content     |         created_at         |         updated_at         
----+-------+----------------+----------------------------+----------------------------
  1 |Article 1|Le contenu de l'article| 2020-09-26 18:18:00.150412 | 2020-09-26 18:18:00.150412
(1 row)

Il contient les données créées par Pry.

Association de modèles

Associer l'article en tant que parent et commenter en tant qu'enfant

Réécrire article.rb comme ci-dessous

python


class Article < ApplicationRecord
    has_many :comments
end

Réécrivez comment.rb comme ci-dessous

python


class Comment < ApplicationRecord
    belongs_to :article
end

Ajouter un fichier de migration d'association

python


docker-compose run web rails g migration Add_Article_Id_To_Comment

Running via Spring preloader in process 68
      invoke  active_record
      create    db/migrate/20200926184159_add_article_id_to_comment.rb

Modifiez le fichier de migration créé ci-dessous

Faites attention à la position de la table.

python


class AddArticleIdToComment < ActiveRecord::Migration[6.0]
  def change
    add_reference :comments, :article, foreign_key: true
  end
end

Connectez-vous à postgres.

python


docker-compose exec db psql -U postgres -d myapp_development

psql (12.4 (Debian 12.4-1.pgdg100+1))
Type "help" for help.

myapp_development=# 


Assurez-vous que articles_id est ajouté à la table des commentaires.

python


myapp_development=# \d comments  
                                          Table "public.comments"
   Column    |              Type              | Collation | Nullable |               Default                
-------------+--------------------------------+-----------+----------+--------------------------------------
 id          | bigint                         |           | not null | nextval('comments_id_seq'::regclass)
 comment     | text                           |           |          | 
 created_at  | timestamp(6) without time zone |           | not null | 
 updated_at  | timestamp(6) without time zone |           | not null | 
 article_id  | bigint                         |           |          | 
Indexes:
    "comments_pkey" PRIMARY KEY, btree (id)
    "index_comments_on_articles_id" btree (articles_id)
Foreign-key constraints:
    "fk_rails_d8ed532d4e" FOREIGN KEY (articles_id) REFERENCES articles(id)

Démarrez pry.

python


comment = Comment.new
=> #<Comment:0x00007f1d8c4f2490 id: nil, comment: nil, created_at: nil, updated_at: nil, article_id: nil>

commentaires Stocke les données dans le modèle.

python


comment.comment = "This is Comment"
=> "This is Comment"

comment.articles_id = 1
=> 1

Validez si l'instance créée par le modèle peut être stockée dans la base de données.

python


comment.valid?
=> true

Enregistrez l'instance dans la base de données.

python


comment.save
   (0.6ms)  BEGIN
  Comment Create (17.2ms)  INSERT INTO "comments" ("comment", "created_at", "updated_at", "article_id") VALUES ($1, $2, $3, $4) RETURNING "id"  [["comment", "This is Comment"], ["created_at", "2020-10-02 12:50:20.046429"], ["updated_at", "2020-10-02 12:50:20.046429"], ["article_id", 1]]
   (3.3ms)  COMMIT
=> true

Créez une instance d'article avec ID1.

python


article = Article.find(1)
  Article Load (3.6ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<Article:0x00007f1f0c612a38
 id: 1,
 name: "Article 1",
 content: "Le contenu de l'article",
 created_at: Sat, 26 Sep 2020 18:18:00 UTC +00:00,
 updated_at: Sat, 26 Sep 2020 18:18:00 UTC +00:00>

Obtenez les données Commentaires associées à l'instance Article 1.

python


commnet = article.comments
=>   Comment Load (2.1ms)  SELECT "comments".* FROM "comments" WHERE "comments"."article_id" = $1  [["article_id", 1]]
[#<Comment:0x00007f1f0c81a088
  id: 1,
  comment: "This is Comment",
  created_at: Fri, 02 Oct 2020 12:50:20 UTC +00:00,
  updated_at: Fri, 02 Oct 2020 12:50:20 UTC +00:00,
  article_id: 1>]

Créez une autre instance de commentaire.

python


commnet = Comment.new
=> #<Comment:0x00007f1f0ca3c780 id: nil, comment: nil, created_at: nil, updated_at: nil, article_id: nil>

Effectuer la validation.

python


commnet.valid?
=> false

Obtenez l'erreur au moment de l'erreur de validation.

python


commnet.errors
=> #<ActiveModel::Errors:0x00007f1f0caa9d58
 @base=#<Comment:0x00007f1f0ca3c780 id: nil, comment: nil, created_at: nil, updated_at: nil, article_id: nil>,
 @details={:article=>[{:error=>:blank}]},
 @messages={:article=>["must exist"]}>

Avec le D ci-dessus

Recommended Posts

[Mon mémo] Entendons-nous bien avec Pry / DB avec Rails
Commençons par la programmation parallèle
Créer ma page avec Rails
Mémo à obtenir avec Struts2 + Ajax
[rails] Faisons un test unitaire avec Rspec!
[Rails] Gérons les constantes avec config gem
Faisons un écran d'erreur avec Rails
Commençons par Java - Créez un environnement de développement ②
Commençons par Java - Créez un environnement de développement ①
Obtenir le modèle enfant avec les rails created_at desc scope
Faisons une fonction de recherche avec Rails (ransack)
Peut-être que ça marche! Commençons avec Docker!
Les débutants de Rails ont essayé de se lancer avec RSpec
S'entendre avec les conteneurs Java dans Cloud Run