![](/img/trans.png)
[英]How do you reference only the persisted records in an active record association
[英]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.