2017-04-26 14 views
2

私はRAILSで新しくなっていますので、私に当たってはいけません。 私は、このような問題を考える:Rails 5.0.2 - ID in relation 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 

それは、&冊の著者が保存されます。ちなみにnewの代わりにbuildメソッドを使用してください。このようにして、すぐにレコードを作成することを示します。

+0

buildまたはnewを使用してください。 'build'は' new'のエイリアスなので、問題ありません。https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L124 – yoones

+1

まさにそうです、これは同じ方法です! 'build'メソッドがあなたの意図を示しているので、私はそれを書きました。一般に、 'new'メソッドはコマンドを使ってオブジェクトを初期化し、それをどこかに渡します。 – nautgrad