2016-08-16 3 views
0
class Comment < ActiveRecord::Base 
    has_many :replies 
end 

class Reply < ActiveRecord::Base 
    belongs_to :comment 
end 

특정 사용자의 답글 만있는 댓글을 가져와야합니다. has_many 관계의 belongs_to 모델 중 일부만 얻으려면 어떻게해야합니까?

scope :with_replies_by_users, ->(*user_ids) { 
joins(:replies).where(replies: { user_id: user_ids }) 
} 


@comments = Comment.with_replies_by_users([1,2]) 

내가이 1 또는 2에 의해 응답이 의견을 모두 반환 것이라고 생각하지만 그 의견에 대한 회신 모든을 반환

내 의견 모델이 있습니다.

+0

나는 splat 연산자 *가 별표 *로 다중 차원 배열을 생성한다고 생각합니다. 'with_replies_by_users' 스코프에서 제거해보십시오. –

+0

@GregAnswer - 두 가지 방법을 모두 시도했지만 동일한 결과가 나타납니다. – atarihomestar

답변

0

을 쿼리하는 데 이러한 조건이 사용 되었기 때문에 범위 예를 가진 모든 사용자의 모든 응답을 계속받는 이유가 있습니다. 즉, 데이터베이스에서 가져온 주석을 판별하는 역할 만합니다. 예를 들어

, 여기에 범위로 실행되는 SQL입니다 ". 내부의 결과에 따라 의견 선택한 응답 테이블과 조인"

>> comments = Comment.joins(:replies).where(replies: { user_id: [2, 3] }) 
Comment Load (0.3ms) SELECT "comments".* FROM "comments" INNER JOIN "replies" ON "replies"."comment_id" = "comments"."id" WHERE "replies"."user_id" IN (2, 3) 

이것은 단지 말하고있다 답장의 결과 때문에 최대한 빨리 회신이 의견 중 하나에 속성 액세스로 지금은 거의 무의미 :

>> comments.first.replies 
Reply Load (0.2ms) SELECT "replies".* FROM "replies" WHERE "replies"."comment_id" = ? [["comment_id", 1]] 
는 고려하지 않기 때문에

액티브는 응답 테이블에 별도의 조회를 할 것입니다 주석 검색의 범위. 당신이 의견보다 응답에 대한 자세한 우려처럼

해결책이 나에게

것 같습니다. 따라서 나는이 쿼리를 접근하는 것 한 가지 방법은, 그러나 열망 로딩 대신 응답 테이블을 조회하는 것입니다 :

>> replies = Reply.includes(:comment).where(user_id: [2, 3]) 
Reply Load (0.4ms) SELECT "replies".* FROM "replies" WHERE "replies"."user_id" IN (2, 3) 
Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = 1 

마지막으로, 당신은 단지 특정 사용자 ID에 대한 응답이 있음. 열심히로드하기 때문에 이미 댓글을 달았습니다. 예를 들어, 다음과 같은 작업을 수행하면 이러한 주석이 메모리에 저장되므로 추가 페치가 발생하지 않습니다.

>> replies.map(&:comment) 

그러나 대답은 액티브 다른 할 것 주석 모델 다른 다시, 또는 중 하나에 속성주의에 액세스 할 수 없습니다 수 가져 오기 :

>> replies.map(&:comment).first.replies 
Reply Load (0.2ms) SELECT "replies".* FROM "replies" WHERE "replies"."comment_id" = ? [["comment_id", 1]] 

당신은 아직도이 범위 확인하려면 , 지금 회신 모델에 갈 것 :

scope :from_users, -> (*user_ids) do 
    includes(:comment).where(user_id: user_ids) 
end 

그런 다음 전화 :

>> Reply.from_users [2, 3] 
Reply Load (0.1ms) SELECT "replies".* FROM "replies" WHERE "replies"."user_id" IN (2, 3) 
Comment Load (0.1ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = 1 
관련 문제