Каждое отношение отличается от всех остальных.То есть, когда вы build
Книга, принадлежащая u.boxes.first
, все Rails заключают, что Книга принадлежит этой Коробке;это ничего не говорит о пользователе.
В этой ситуации, когда (предположительно) книги всегда принадлежат человеку, которому принадлежит ящик, в котором они находятся, вам, вероятно, лучше всего иметь отношения has_many :through
:
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
Если это не так (возможно, вы помогаете мне переместиться?), Оставьте ассоциации как есть, но вам, например, придется установить хотя бы одно из отношений вручную.:
b = u.boxes.first.books.build(:title => "foo")
b.user = u
b.save
# or...
u.boxes.first.create_book(:title => "foo", :user => u)
(Пара других моментов. Во втором примере вы должны сохранить Книгу, а не Пользователя; вы можете одновременно выполнить build
и save
в одной операции с create
)