2017-04-26 78 views
2

我是RAILS的新手,所以不要打我。 我考慮這樣的問題:Rails 5.0.2 - 關係中的ID belongs_to/has_many

- author 
    has_many :books 
- book 
    belongs_to :author 

在控制檯創建一個新的作家,每比如:這個記錄的

ar = Author.new(fname: "Frank", lname: "Herbert") 

ID未設置前保存。

然後,我創建對象的AR一些書:

ar.books.new(title: "Dune"), ar.books.new(title: "The Green Brain") 

沒有錯誤。但當我列出書籍:

ar.books.all 

得到一個空的列表。 我想通了,首先我必須保存ar,然後我可以添加書籍。

有沒有辦法將ar與書籍保存在一起,不需要保存ar之前沒有書籍?

+0

據我所知,答案是否定的。首先,您必須創建一個帶有id的作者記錄,該記錄將在書中用作外鍵。 – marmeladze

+0

因此,當我創建**新**作者並嘗試添加書籍 – KilgoreTrout

+0

@KilgoreTrout時,它會複雜化嵌套表單,首先創建作者,然後創建書籍,嘗試一次創建兩個書籍。你可以檢查我發佈的答案。 – puneet18

回答

1

請按照以下代碼: 先創建作者,然後創建作者作爲外鍵的書籍。

ar = Author.new(fname: "Frank", lname: "Herbert") 
ar.save 

ar.books.create(title: "Dune") 
ar.books.create(title: "The Green Brain") 

OR

ar = Author.new(fname: "Frank", lname: "Herbert") 
ar.books.build(title: "Dune") 
ar.books.build(title: "The Green Brain") 
ar.save 
+0

您可以使用創作作爲而不是新+保存。 – yoones

1

當然可以!

您需要致電ar.books查找已添加的書籍。當你致電ar.books.all ActiveRecord試圖在數據庫中查找某些東西(顯然它會返回空數組)。所以剛:

author = Author.new(fname: "Frank", lname: "Herbert") 
author.books.build(title: "Dune") 
author.save 

像您期望這將節省作者&書籍。順便用build方法代替new。這樣你就可以證明你即將創造記錄。

+0

使用build或new,這並不重要,因爲'build'只是'new'的別名。https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L124 – yoones

+1

沒錯,你是對的,這是同樣的方法!我寫了它,因爲'build'方法顯示了你的意圖。通常'new'方法在命令中使用來初始化對象,然後將它傳遞給某個地方。 – nautgrad