10

내 코드STI와 형체는

class Post < ActiveRecord::Base 
end 

class NewsArticle < Post 
    has_many :comments, :as => :commentable, :dependent => :destroy, :order => 'created_at' 
end 

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true, :counter_cache => true 
end 

로 그리고 내가

Comment Load (0.9ms) SELECT "comments".* FROM "comments" WHERE ("comments"."commentable_id" = 1 and "comments"."commentable_type" = 'Post') ORDER BY created_at 

이상한처럼 로그 무언가 참조 일부 NewsArticle에 대한 의견을 가서 시도에서 문제가 "commentable_type"= '포스트 그 '. 무엇이 잘못 되었나요?

PS는 : 2.3.5 & & 루비 1.8.7은 (2010-01-10 패치 레벨이 249)는 i686가-darwin10 상기 commentable_type 필드는 테이블의 이름을 저장해야

답변

5

가이 포함 레일 데이터를 가져 오면 해당 행이 오른쪽 테이블에서로드되면 유형게시물 테이블에서 상속 된 유형이로드됩니다.

so :

여기에서 주석은 주석이있는 테이블을 가리 킵니다. 포스트 테이블

>> Comment.first 
=> #<Comment id: 1, commentable_id: 1, commentable_type: "Post", body: "test", created_at: "2010-04-09 00:56:36", updated_at: "2010-04-09 00:56:36"> 

1이어서 NewsArticle를로드 ID는, ID 1 포스트로부터 로딩되고, 입력은 NewsArticle가 나타낸다.

>> Comment.first.commentable 
=> #<NewsArticle id: 1, type: "NewsArticle", name: "one", body: "body", created_at: "2010-04-09 00:55:35", updated_at: "2010-04-09 00:55:35"> 
>> Comment.first.commentable.class.table_name 
=> "posts" 

"NewsArticle" 열린 commentable_type경우 테이블을 결정하는 클래스보고해야합니다. 이렇게하면 테이블을보고 유형에 대해 걱정할 수 있습니다.

+0

huh ... 테이블 이름은 정확하지만 STI 모델 이름이 잘못되었습니다. –

+0

다형성 관계의 경우 테이블 만로드되면 해당 테이블이 상속 유형을 결정할 수 있습니다. – danivovich

1

ActiveRecord::Associations API의 다형성 연관 섹션을 살펴보십시오. 단일 테이블 상속과 함께 다형성 연관을 사용하는 것에 대해서는 조금 있습니다. 이 섹션의 두 번째 코드 예제에 따르면 나는 이것이 원하는 것에 가깝다고 생각합니다.

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true, :counter_cache => true 

    def commentable_type=(sType) 
    super(sType.to_s.classify.constantize.base_class.to_s) 
    end 
end 

class Post < ActiveRecord::Base 
    has_many :comments, :as => :commentable, :dependent => :destroy, :order => 'created_at' 
end 

class NewsArticle < Post 
end 
0

기술적으로 실제로는 아무 문제가 없습니다. Rails가 다형성 연관을 처리하고 관련 객체가 STI를 사용하고있을 때, 단순히 기본 클래스를 유형 ("commentable_type"의 경우)으로 사용합니다.

게시물과 NewsArticle이 별도의 테이블에있는 경우 분명 commentable_type이 Post 및 NewsArticle으로 표시됩니다. 당신이 상속 클래스를 저장하려면 무엇을해야 하는지를

+0

NewsArticle에서이 주석이 올바른 경우 어떻게 검색 할 수 있습니까? 내 질문에 기본 클래스 유형을 검색하기 때문에 아무것도 반환하지 않는 비슷한 문제가 있습니다. – sweetroll

1

데프 commentable_type = (STYPE) 슈퍼 (sType.to_s.classify.constantize.base_class.to_s) 끝 포스트 등

이 방법은 반환 클래스, commentable_type으로 게시 하시겠습니까?

1

좋은 질문입니다. 나는 Rails 3.1을 사용하여 똑같은 문제를 겪었다. 아직 문제가 해결되지 않은 것 같습니다. 분명히 Rails에서 단일 테이블 상속 (STI)과 결합 된 다형성 연관을 사용하는 것은 약간 복잡합니다.

레일스 3의 현재 레일즈 문서.좀 까다로운 단일 테이블 상속 (STI)와 조합 다형성 연관 사용

: 2 polymorphic associations and STI 조합이 조언을 제공한다. 에 대한 연관이 예상대로 작동하려면 STI 모델의 기본 모델을 다형성 연관의 유형 열에 저장하십시오.

기본 모델은 '게시', 즉 모든 댓글에 대해 '코멘트 가능 유형'은 '게시'여야합니다.