簡體   English   中英

如何創建和保存一個引用了自身的 Active Record 實例?

[英]How do you create and save an Active Record instance that has a reference to itself?

Files是一個 Active Record model,它引用了相同類型的父對象:

class Files < ActiveRecord::Base
  belongs_to :parent, class_name: "Files"
end

我想創建一個root條目,其父項是它自己(它模仿具有..指向自身的根目錄)。

我嘗試了幾種不同的方法,其中大部分最終都試圖將記錄保存到數據庫中,而父項仍設置為 null。數據庫設置為在該字段為 null 時拋出異常。我試過:

Files.new { |f|
  f.parent   = f
}.save

Files.create { |f|
  f.parent   = f
}

我也試過

Files.new { |f|
  f.parent_id = f.id = Files.next_sequence_value
}.save

我看過build_parent

創建自引用關聯時,外鍵列必須可以為空且關聯必須是可選的。 否則,您將陷入先有雞還是先有蛋的局面,您無法創建第一條記錄,因為它必須引用一條不存在的記錄。

class Files < ActiveRecord::Base
  belongs_to :parent, 
    class_name: self.name,
    optional: true
end

使用下一個序列值實際上不是一個好的選擇,因為如果您有外鍵約束,它將不起作用。

這里的命名也是有問題的。 Files是復數形式,這會打破慣例並導致各種問題,還會使您的開發人員同事感到困惑。 但是File將不起作用,因為它是 Ruby StdLib 的一部分。 我建議使用諸如 Attachment、Document 之類的替代方法或使用諸如MyApp::File之類的命名空間。

暫無
暫無

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

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