2011-08-16 7 views
1
class User < ActiveRecord::Base 
    has_many :boxes 
    has_many :books 
end 

class Box < ActiveRecord::Base 
    belong_to :user 
    has_many :books 
end 

class Book < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :box 
end 

でのビルド方法についての混乱私は、コンソールに以下の実行したときに、私は期待して、それは動作しますが、新しいボックスを作成し、ボックスActiveRecordの

>> u = User.first 
>> u.boxes.build(:height => 3, :width => 1, :length => 4) 
>> u.save 

へのuser_idを取り付けるので、私はさらに行くとこれを試みなさい。 box_idは設定されていますが、本のuser_idは設定されていません。

>> u.boxes.first.books.build(:title => 'Reading is fun') 
>> u.save 

私はここでかなり基本的な概念がないようです。あなたがここにboxのために呼び出されbuild方法だから

u.boxes.first.books.build(:title => 'Reading is fun', :user_id => u.id) 

でなければなりません

答えて

2

各関係は他のすべての関係とは異なります。つまり、あなたがu.boxes.firstに属するbuild帳を登録すると、すべてのRailsはブックがそのボックスに属することを推測します。ユーザーについては何も言いません。それがない場合は

class User < ActiveRecord::Base 
    has_many :boxes 
    has_many :books, :through => :boxes 
end 

class Box < ActiveRecord::Base 
    belong_to :user 
    has_many :books 
end 

class Book < ActiveRecord::Base   
    belongs_to: box 
    delegate :user, :to => :box # since belongs_to doesn't take :through 
           # passes Book#user through to Book#box.user 
end 

:(おそらく)書籍は、常に彼らがしているボックスを所有している人によって所有されている。このような状況では、

は、おそらくhas_many :through関係にオフ最高ですケース(おそらくあなたは私を動かす助けている?)、彼らがそうであるように関連付けを残していますが、例えば、手動での関係の少なくとも一つを設定する必要があります:

b = u.boxes.first.books.build(:title => "foo") 
b.user = u 
b.save 

# or... 
u.boxes.first.create_book(:title => "foo", :user => u) 

(他の点のカップル2番目の例では、ユーザーではなく本を保存する必要があります。 1回の操作でbuildsaveの両方を実行できます。create

+0

これは多くの意味があります。私はそれがhas_many:throughの関係と関係していたと感じました。 – mkly

+0

それでは、私はこの本にユーザーIDを渡す必要があります。なぜなら、それは遠くまで見ることができないからです。これは非常に役に立ちます。ありがとうございました。 – mkly

+0

':through'を使用していない場合のみ。 ':through'を使用している場合、' books'テーブルは 'user_id'カラムを必要とせず、すべてが' Box'モデルを介して自動的に設定されます。 – Chowlett

2

。そして、そのようなbuild作品:

parent.children.build 
# The same as: 
parent.children.new(:parent_id => parent.id) 

ので、ここでは、祖父母については何もありません。

+0

ありがとうございます。それは非常に役に立ちます。私はあなたが私を助けてくれたときに両方のチェックマークを付けることができたらいいと思う。私は完全に理解しています。 – mkly

+0

@Mike、\ no problems – fl00r