2011-08-16 2 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 

그래서 새로운 상자를 생성하고 상자에 USER_ID를 부착, 작동혼란이

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

그럼 내가 더 나아가 이것을 시도하십시오. box_id가 설정되었지만 책의 user_id가 설정되지 않았습니다.

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

나는 여기 꽤 기본적인 개념을 놓치고있는 것처럼 보입니다. 여기 build 방법을 왜냐하면

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

을해야

답변

2

각 관계는 다른 모든 관계와 다릅니다. 즉, u.boxes.first에 속한 build 책이있을 때 모든 레일스는 해당 책이 해당 상자에 속한다는 것을 유추합니다. 그것은 사용자에 대해 아무 말도하지 않습니다. (아마도) 책은 항상 그들이에있는 상자를 소유 한 사람이 소유 이러한 상황에서

, 당신은 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) 

(커플 두 번째 예에서는 사용자가 아닌 책을 저장해야합니다. 당신은 create으로 buildsave을 모두 할 수 있습니다. create

+0

이것은 많은 의미가 있습니다. 나는 그것이 has_many : with 관계로해야한다고 느꼈다. – mkly

+0

좋아, 아무리해도 그 책을 볼 수 없기 때문에 사용자 아이디를 책에 전달해야 할 것입니다. 이것은 매우 도움이됩니다. 고맙습니다. – mkly

+0

': through'을 사용하지 않는 경우에만. ': through'를 사용한다면,'books' 테이블은'user_id' 컬럼을 필요로하지 않고 모든 것이'Box' 모델을 통해 자동으로 설정됩니다. – Chowlett

2

box 호출됩니다. 그리고 그런 build 작품 :

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

그래서 여기 조부모에 대해 아무것도 없다.

+0

고맙습니다. 그것은 매우 도움이됩니다. 둘 다 나를 도왔을 때 내가 체크 표시를 할 수 있었으면 좋겠어. 나는 완전히 이해한다. – mkly

+0

@Mike, \ no problems – fl00r

관련 문제