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.