2012-03-13 2 views
0

나는 두 가지 모델이 첫 번째 항목 찾기 :레일 - 액티브 쿼리 - relationship.count 적어도 1

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

나는 적어도 하나 개의 댓글이 가장 최근의 포스트를 찾기 위해 시도하고있어합니다.

나는이 시도 :

@post = Post.find_by_sql("SELECT *, count(comment.id) AS num_of_comments 
    FROM post 
    INNER JOIN comment ON post.id = comment.post_id 
    WHERE num_of_comments >= 1").last 

을하지만 num_of_comments 알 수없는 열였다 말하는 오류가 발생했습니다.

는 그럼 난 이후에 방법을 시도하지만, 작동하지 않았다 : 다음 범위에 찾기 시작

def self.has_been_commented 
    where("comments.count <= 1") 
end 

하고 .joins 방법을 보았지만, 그때 지정할 수 있는지 확실하지 않았다 다른 필터. 뭔가처럼 : 그 혼란 경우

+0

은 약 나는 그것을 테스트 할 수 없기 때문에 대답,하지만 같은이 게시되지 않음 : –

+0

알 수없는 열'comments.id '가 발생했습니다 – MAckerman

+0

생성 된 SQL은 입니다. ActiveRecord :: StatementInvalid : Mysql :: Error : 알 수없는'comments.id '열이'having clause ' : SELECT'post'. * FROM'post' INNER JOIN'comment' ON'comment'.post_id' ='post'.id' HAVING count (comments.id)> 1 모든 것이 HAVING에 좋을 것 같습니다. section – MAckerman

답변

0

는 내 질문에 대한 답을 발견 comments.id)> 1 ')`
0

...

죄송합니다 당신은 복수가 : (> = 1 comments.count)

scope :has_been_commented, joins(:comments) 

하지만 나는 곳을 지정하는 방법을 잘 모르겠어요 comments 및 단 하나의 comment이 자유롭게 함께 혼합된다. "Rails 방식"을 따르고 있다면 모든 것이 복수형이 될 것입니다. 데이터베이스 이름도 을 제외하고는 클래스 이름입니다. 목표는 생성중인 SQL이 보유한 데이터베이스 테이블과 일치하는지 확인하는 것입니다. (.having ('수 :`Post.joins (: 댓글)

Post.find(:all, :joins => "INNER JOIN comment ON comment.post_id = post.id", . 
    :select => "post.*, count(comment.id) comment_count", 
    :group => "comment.post_id HAVING comment_count >= 1").last 
+0

네 말이 맞아. 불행하게도 나는이 프로젝트를 물려 받았고 제작자는 단 하나의 테이블 이름을 사용했다. 나는 복수형을 가지고 있지만 SQL에 복사/붙여 넣기 서식 오류가있었습니다. 재미있는 모델 이름 바꾸기? – MAckerman