Dieses Mal werde ich erklären, wie ein Fehler verhindert werden kann, auch wenn der externe Schlüssel Null ist.
Informationstabelle
id |
talent_name |
age |
user_id |
---|---|---|---|
1 | Yamada Taro | 20 | nil |
2 | Hanako Yamada | 20 | nil |
Benutzertabelle
id |
login_name |
---|---|
1 | nick |
2 | tom |
Dieses Mal werden wir diese beiden Tabellen verwenden. Die Benutzertabelle und die Informationstabelle bilden eine Zuordnung. Die Benutzertabelle ist das übergeordnete Element und die Informationstabelle ist das untergeordnete Element.
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)
Eigentlich Benutzer_Es gibt eine ID-Spalte. Nutzer_id:Nein, tut mir leid
Es wird auf dem Weg zurückgesetzt und Sie können sehen, dass id nil ist, created_at und updated_at ebenfalls nil in der Informationstabelle sind und nicht gespeichert werden können.
Also diesmal Ich werde erklären, wie man speichert, auch wenn user_id null ist. Öffnen Sie zunächst das Modell für kleine Elemente.
infomation.rb
class Infomation < ApplicationRecord
belongs_to: user
end
Ich denke, Sie bilden eine Vereinigung wie diese, aber bitte fügen Sie optional hinzu: true daneben.
infomation.rb
class Infomation < ApplicationRecord
belongs_to: user,optional: true
end
Dann
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('Alter').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)
Es wurde richtig begangen und gerettet !!!!!! Optional: true bedeutet übrigens, dass der externe Schlüssel null ist.