1

레일에서 - has_many를 사용했을 때의 영향 : has_and_belongs_to_many?has_many : through와 with_and_belongs_to_many with Rails

class Tag < ActiveRecord::Base 
    has_many :posts_tag 
    has_and_belongs_to_many :posts 
end 

class Post < ActiveRecord::Base 
    has_many :posts_tag 
    has_many :tags, :through => posts_tag 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :post 
end 

나는 tag 많은 게시물에 속하기 때문에 has_and_belongs_to_many가 사용하는 이유 : 아래에 표시된 게시물과 다 대다 관계가 태그 - 두 가지 모델을 준비하십시오.

나는 Rails Association guide을 조사했는데 다 대다 관계에 대해이 사례를 언급하지 않았다는 것을 알았습니다. 그러나 나는 이것을 시도해 보았고 Rails에서 실행해도 아무런 문제가 발생하지 않았고 내가 만든 작은 테스트 데이터베이스에서 post.tagstag.posts에 대한 정확한 결과를 반환하는 것으로 보였습니다. posttagPostTag 모델입니다.

이 올바른 사용법입니까, 아니면 내가 모르는 부작용이 있습니까? 또한, 그것이 맞다면 이것을 달성하는 레일 방식입니까?

감사합니다.

답변

2

many-to-many 연관을 설정할 때만 has_and_belongs_to_many을 사용합니다 (다른 쪽에도 has_and_belongs_to_many이있는 경우). 그것이이 협회의 의미입니다.

당신은 내가 (이 올바른 방법이기 때문에) 복수, post_tags을 사용

class Tag < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :posts, :through => :post_tags 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :post 
end 

class Post < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :tags, :through => :posts_tags 
end 

주의를해야한다.

당신이 당신의 의견에 같은 상황이있는 경우, 당신이해야 당신의 PostTag 모델의

belongs_to :post_tag 
당신의 Post 모델

has_many :posts 

.

이제 요청할 수 있습니다 : "나는 belongs_to :post_tag를 사용해야하는 이유 그것은 가 태그 그래서, has_one :post_tag를 사용하지 말아야을이 아니라 는 태그에에 속하나요?.?". 이것은 처음에는 내 질문 이었지만 레일스가 항상 영어에 완벽하게 맞설 수는 없다고 생각했습니다. postpost_tag_id 열이 있어야하고 belongs_to과 정확히 일치해야합니다. 한편 has_one은 이라는 열이 기타 쪽, 즉 post_tag에 있다고 예상합니다. 그러나 post_tag에는 posts (하나뿐 아니라)이 많기 때문에 불가능합니다. 따라서 post ID는 post_tags에 보관할 수 없습니다.

업데이트 : 당신이 통과 할 수
이 협회의 차이 만 방법 당신이 제공하고 옵션 (하나는 협회에 안내 레일에서 설명). 예를 들어, 방법 association=create_association (나는 위에서 설명한 같은) 외부 키가 있어야 할 곳에와 관련된 다른 일을 의미,

association(force_reload = false) 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 

그러나 예를 들어, has_onebelongs_to 같은 방법이있다.

has_and_belongs_to_manyhas_many은 아마도 메소드에서 다른 것이 없지만 전달할 수있는 옵션이 다릅니다. 예를 들어, has_many 협회에

:dependent => :destroy 

에 전달할 수 있습니다,하지만 그건 이해가되지 않기 때문에 그 의미하기 때문에 당신이하는 has_and_belongs_to_many에 전달할 수 없습니다 many-to-many 연관; 부모 레코드가 파괴되면 자식 레코드는 다른 레코드와 연결될 수 있으므로 파괴되지 않아야합니다.

+0

네, "레일스가 항상 영어에 어울리는 것은 아닙니다."라고 말한 부분은 내가 생각하기에 P 몇 가지 일반적인 작업이'has_many : through'와'has_and_belongs_to_many'로 작동한다는 것을 감안할 때, 순전히 교육학적인 관점에서 그것이 부작용이 있는지를 아는 것은 흥미로울 것입니다. 나는 그것을 사용하는 올바른 방법이 아니라는 것을 이해합니다. –

+0

업데이트를 확인하십시오. –

+0

감사! 그건 의미가 있습니다 :) –

1

나는 관계의 한 측면에 has_many :through과 반대편에 has_and_belongs_to_many을 갖는 정확한 효과를 잘 모르겠어요 동안, 나는 더 올바른 방법, 그래서 같은 반전 has_many :through을 사용하는 것입니다 것을 알 수 있습니까 :

class Tag < ActiveRecord::Base 
    has_many :posts_tag 
    has_many :posts, :through => posts_tag 
end 

다른 관계를 동일하게 유지합니다.

+0

관계의 한쪽면에서 'has_one'을 사용하고 다른면에서 'has_and_belongs_to_many'를 사용하는 경우의 부작용은 어떨까요? 예를 들어 위의 예제에서 각 포스트는 최대 하나의 '태그'를 가질 수있다. 그러나 '태그'는 많은 '게시물'에 속합니다. –

+0

이 경우 당신은 약간의 관계가 있습니다. 태그'has_many'는 게시물이고 게시물은'belongs_to' 태그입니다. Post는'tag_id'를 가지므로 하나의 태그 만 허용됩니다. 'has_and_belongs_to_many'는'has_many'가 사용하지 않을 숨겨진 조인 테이블을 사용할 것입니다. – ctcherry