[RUBY] So speichern Sie, auch wenn der externe Schlüssel Null ist

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.

Recommended Posts

So speichern Sie, auch wenn der externe Schlüssel Null ist
So löschen Sie Daten mit einem externen Schlüssel
Wie viel IDEA kann uns mit Java-Spock helfen
Organisieren Sie Methoden, die mit StringUtils verwendet werden können