2017-04-26 94 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