[RUBY] Comment enregistrer même si la clé externe est nulle

Cette fois, je vais vous expliquer comment éviter une erreur même si la clé externe est nulle.

table d'information

id talent_name age user_id
1 Yamada Taro 20 nil
2 Hanako Yamada 20 nil

table des utilisateurs

id login_name
1 nick
2 tom

Cette fois, nous utiliserons ces deux tableaux. La table des utilisateurs et la table des informations forment une association. La table users est le parent et la table infomation est l'enfant.

Running via Spring preloader in process 5268
Loading development environment (Rails 5.2.4.4)
[1] pry(main)> Scraping.get_infomation
D, [2020-11-09T06:30:25.470701 #5268] DEBUG -- :    (0.3ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
D, [2020-11-09T06:30:25.489471 #5268] DEBUG -- :   Infomation Load (1.5ms)  SELECT  `infomations`.* FROM `infomations` WHERE `infomations`.`name` = 'Haru' ORDER BY `infomations`.`id` ASC LIMIT 1
D, [2020-11-09T06:30:25.503981 #5268] DEBUG -- :    (0.1ms)  BEGIN
D, [2020-11-09T06:30:25.524340 #5268] DEBUG -- :    (0.1ms)  ROLLBACK
Return value is: nil

[24, 33] in /home/ec2-user/environment/filebook/app/models/scraping.rb
   24:         names = aaas.at('h1').inner_text  if aaas.at('h1')
   25:         image_urls = personal_page.at('.main_image img').get_attribute('src') if personal_page.at('.main_image img')
   26:         infomation = Infomation.where(name: names).first_or_initialize
   27:         infomation.age = ages
   28:         infomation.image_url = image_urls
   29:         infomation.save
   30:         
   31:         byebug
=> 32:     end
   33: end
(byebug) infomation
#<Infomation id: nil, age: 29, name: "Haru", image_url: "https://images.talent-dictionary.com/uploads/image...", created_at: nil, updated_at: nil>
(byebug) 
En fait utilisateur_Il y a une colonne id. utilisateur_id:nul désolé

Il est annulé en cours de route et vous pouvez voir que id est nul, created_at et updated_at sont également nil dans la table d'informations et il ne peut pas être enregistré.

Alors cette fois Je vais vous expliquer comment sauvegarder même si user_id est nul. Tout d'abord, ouvrez le modèle de petits éléments.

infomation.rb


class Infomation < ApplicationRecord
    belongs_to: user
end

Je pense que vous formez une association comme celle-ci, mais veuillez ajouter facultatif: true à côté.

infomation.rb


class Infomation < ApplicationRecord
    belongs_to: user,optional: true
end

ensuite

Running via Spring preloader in process 6358
Loading development environment (Rails 5.2.4.4)
[1] pry(main)> Scraping.get_infomation
D, [2020-11-09T06:45:18.429070 #6358] DEBUG -- :    (0.4ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
D, [2020-11-09T06:45:18.434125 #6358] DEBUG -- :   Infomation Load (0.2ms)  SELECT  `infomations`.* FROM `infomations` WHERE `infomations`.`name` = 'Miyama Kakoi' ORDER BY `infomations`.`id` ASC LIMIT 1
D, [2020-11-09T06:45:18.440170 #6358] DEBUG -- :    (0.1ms)  BEGIN
D, [2020-11-09T06:45:18.442031 #6358] DEBUG -- :   Infomation Create (0.2ms)  INSERT INTO `infomations` (`age`, `name`, `image_url`, `created_at`, `updated_at`) VALUES (23, 'Miyama Kakoi', 'https://images.talent-dictionary.com/uploads/images/tldb/086a19d1703dda4390ae74328861c5c858939acb.jpg', '2020-11-09 06:45:18', '2020-11-09 06:45:18')
D, [2020-11-09T06:45:18.444995 #6358] DEBUG -- :    (2.3ms)  COMMIT
Return value is: nil

[23, 32] in /home/ec2-user/environment/filebook/app/models/scraping.rb
   23:         ages = aaas.at('.age').inner_text.delete('âge').to_i if aaas.at('.age')
   24:         names = aaas.at('h1').inner_text  if aaas.at('h1')
   25:         image_urls = personal_page.at('.main_image img').get_attribute('src') if personal_page.at('.main_image img')
   26:         infomation = Infomation.where(name: names).first_or_initialize
   27:         infomation.age = ages
   28:         infomation.image_url = image_urls
   29:         infomation.save
   30:         byebug
=> 31:     end
   32: end
(byebug) 

Il a été correctement engagé et enregistré !!!!!! Au fait, facultatif: true signifie autoriser la clé externe à zéro.

Recommended Posts

Comment enregistrer même si la clé externe est nulle
Comment supprimer des données avec une clé externe
Dans quelle mesure IDEA peut nous aider avec Java-Spock
Organiser les méthodes qui peuvent être utilisées avec StringUtils