簡體   English   中英

帶有 has_one 的 ActiveRecord 批量插入

[英]ActiveRecord bulk insert with has_one

你有沒有解決過用嵌套關聯批量插入記錄的問題? (使用 rails insert_all 或使用 import gem)示例:

Dog.import!(array_of_dogs)

Dog.insert_all(array_of_dogs)

如果狗的所有者協會為

has_one :owner, class_name: Person

並期望堅持所有的狗和他們的主人。

有一種叫做 DutyFree 的寶石可以讓這種事情變得簡單。 想象一下,有一個包含三個類別、子類別和餐館表的模式:

___________     _____________     _____________
|Category |     |Subcategory|     |Restaurant |
|         |     |           |     |           |
|         |---->|belongs_to |---->|belongs_to |
|         |     |   Category|     |Subcategory|
|         |     |           |     |           |
¯¯¯¯¯¯¯¯¯¯¯     ¯¯¯¯¯¯¯¯¯¯¯¯¯     ¯¯¯¯¯¯¯¯¯¯¯¯¯

這個 gem 智能地分析模型上的 has_many 和belongs_to 關聯,並根據這些關系確定如何在所有目標表中正確保存每個導入的行。 根據數據是否已經存在來執行創建或更新,並且它是基於每個表的,因此例如如果類別已經存在但子類別或餐廳不存在,那么只有這兩個部分是添加並關聯到適當的類別。

這個具體的例子可以在這里的測試中看到: https : //github.com/lorint/duty_free/blob/master/spec/models/restaurant_reverse_spec.rb

對於 Dog 和 Person 示例,您需要做的就是將 gem 放入 Gemfile 並打包之后,打開bin/rails c並嘗試使用以下命令導出示例:

Person.df_export

它應該會自動通過個人的belongs_to 來找到他們相關的Dog。 (順便說一下,您可能會考慮切換此關聯,以便belongs_to 在Dog 中,而不是has_one 將其轉換為has_many,這樣一個人就可以擁有許多條狗。但那是另一回事了。如果您要切換它會更有意義做 Dog.df_export 或 Dog.suggest_template。)

如果您想進一步自定義所涉及的列,請讓 gem 為您提供一個入門模板,該模板可以通過以下方式直接添加到 Person 模型中:

Person.suggest_template

它顯示的 IMPORT_TEMPLATE 哈希包含有關您希望具有唯一性的列的詳細信息,例如此人的電子郵件或電話號碼,以及可能是狗的生日或其他內容。

希望所有這些都有幫助。

你有兩種可能。

  1. 您刪除所有約束並插入所有數據並在最后添加約束。 這是有效的,因為在備份時所有約束都起作用並且在恢復后會起作用

  2. 您一次只能插入一個表,因此您創建了數據庫的 ER 模型,查看必須先創建哪些表,以便可以使用已創建的合作伙伴表創建上面層次結構中的所有表. 依此類推,直到你到達終點。 ER 模型不是絕對需要的,但在具有大量表的大型數據庫中,它有助於保持順序,並且使用正確的程序,您可以移動表以找到正確的恢復順序。

您必須單獨插入關聯。

我已經在我的博客中解釋了我如何解決這個問題 - https://medium.com/@muralidharanashish/bulk-import-in-ruby-on-rails-8546fed74f4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM