사진에 대한 최근 코멘트 10 개를 찾으려고 노력하고 있으므로이를 레일즈 3.0.3 애플리케이션의 활동 피드에 통합 할 수 있습니다. commentable가 코멘트 모델에 설명되어레일 : 다형성 연관과 STI가 포함 된 쿼리 구조화
class Upload < ActiveRecord::Base
...
end
class Photo < Upload
has_many :comments, :as => :commentable
...
end
다형성 협회 :
는 내가 단일 테이블 상속을 사용하여 업로드 모델에서 상속 사진 모델을 가지고
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
end
지금까지 그렇게 좋았지? 문제는 쿼리를 만들려고 할 때 발생합니다. 약간의 시행 착오 후에, 나는 사진 모델에 앉아이 코드를 내놓았다 :
def self.latest_comments(count = 10)
Comment.where(:commentable_type => "Upload")\
.joins("INNER JOIN uploads ON comments.commentable_id = uploads.id")\
.where("uploads.type" => "Photo").order("comments.created_at DESC").limit(count)
end
이 코드는 SQLite는 내 개발 시스템에서 작동하지만, 난 일하러 일부 변경을 했어 PostgreSQL을 사용하는 프로덕션 서버에서. 위의 쿼리의 화신은 아직 프로덕션 서버에서 테스트되지 않았지만 위의 쿼리가 매우 강건하지도 않으며 매우 'Railsy'한 것처럼 보이지 않으므로 쿼리를 구조화하는 더 깨끗한 방법을 찾고있었습니다. 내가 좋아하는 것 무엇
이말할 수있을 것입니다
Comment.joins(:commentable => :photo)
입니다 ... 그러나 이것은 레일이해야 할 방법을 알고하지 않습니다 아마도 때문에, 예외가 발생 조인 :
ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :commentable
다형성 연관을 쿼리하는 다른 방법을 설명한 post on StackOverflow이 있습니다. 사진 업로드에서 상속되기 때문에, 내가 직접 의견을 사진에 관한 가져올 수 없습니다
Comment.find_all_by_commentable_type("Upload", :include => :commentable,
:order => "created_at DESC", :limit => 10)
그러나,이 STI 작동하지 않습니다 :이 게시물에 따라 다음 코드로 올 수 있었다 - Upload를 상속 한 모든 클래스에 대한 주석 만.
나는 다형성이나 STI와 관련된 다른 게시물을 꽤 많이 보았지만 찾고있는 방식으로 두 가지를 결합한 것은 없습니다. 나는 초기 질의와 관련 지을 수 있지만, 다형성과 관련된 질의를 구조화하는 다른 방법에 대한 생각은 전혀 없다. 과 STI?
: 여기에서 내 것과 같은 줄을 따라 another question을 찾았습니다. 불행히도, 최고의 대답은 내가 찾고있는 해결책을 제공하지 못했습니다. 문제에 적용하려면 Photo
모델에서 Upload
모델로 has_many :comments
연결을 이동하고 Comment 클래스에 일부 코드를 추가하여 commentable
의 올바른 클래스를 결정해야합니다. 업로드의 하위 클래스에 주석이 포함된다는 점에서 모델링이 중단되므로 이상적이지 않습니다. 더 좋은 방법이있을거야 ...?
답장을 보내 주셔서 감사합니다.하지만 내 모델은 사진이 아닌 업로드 만 주석 처리 할 수 있다고 지정합니다. 슈퍼 클래스'Upload'에'has_many : comments'라는 연관성이 주어지면 크게 단순화되지만, 이렇게하면 내 모델을 깨뜨리고 싶지 않습니다. 그런 식으로 내 모델을 혼란스럽게하고 싶지 않다면, 긴 체인 쿼리없이 실제로 가능하게하고 싶습니다. – JamesDS