[英]eager load ActiveRecord polymorphic associations that are 'has_one'
[英]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 哈希包含有關您希望具有唯一性的列的詳細信息,例如此人的電子郵件或電話號碼,以及可能是狗的生日或其他內容。
希望所有這些都有幫助。
你有兩種可能。
您刪除所有約束並插入所有數據並在最后添加約束。 這是有效的,因為在備份時所有約束都起作用並且在恢復后會起作用
您一次只能插入一個表,因此您創建了數據庫的 ER 模型,查看必須先創建哪些表,以便可以使用已創建的合作伙伴表創建上面層次結構中的所有表. 依此類推,直到你到達終點。 ER 模型不是絕對需要的,但在具有大量表的大型數據庫中,它有助於保持順序,並且使用正確的程序,您可以移動表以找到正確的恢復順序。
您必須單獨插入關聯。
我已經在我的博客中解釋了我如何解決這個問題 - https://medium.com/@muralidharanashish/bulk-import-in-ruby-on-rails-8546fed74f4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.