2013-02-15 5 views
2

find my sql을 (를) 사용하고 있는데 데이터베이스에서 무언가를 계산하고 내 모델에 추가하려고합니다.Find_by_sql 및 계산 된 필드

@users = User.find_by_sql("select * (select count(*) from comments where user_id=u.id) as comments_count from Users u") 


@user.map{|u| puts u.comments_count} 

어떤 도움 :

나는 다른 곳에서 코드

class User < ActiveRecord::Base 
    attr_accessor :comments_count 

end 

그리고 단순화하려고 줘야 해?

답변

0

좋아, 알겠습니다. attr_accessor와는 아무런 관련이 없습니다. 나는 그것을 제거해야만했다.

@users = User.find_by_sql("select * (select count(*) from comments where user_id=u.id) as comments_count from Users u") 

@user.map do |u| 
    puts u.comments_count if @user.has_attribute?(:comments_count) 
end 
+0

솔루션에 대해 자세히 설명해 주시겠습니까? Q map map call과 다른 점은 무엇입니까? 나는 똑같은 문제에 직면 해있다. – mlt

1

ActiveRecord는 불행히도 선택한 열과 모델의 특성을 일치시키는 것이 아닙니다. 그러나 그와 비슷한 것은 아마 합쳐지기 쉽습니다. 첫째로 당신은 이런 식으로 find_by_sql에 과부하가 필요 했어 -

def self.find_by_sql(sql) 
    values = connection.select_all(sql) 

    objects = [] 

    values.each do |row| 
     objects << self.new(row) 
    end 

    objects 
end 

그리고 대량 스키마 기반의 속성을 할당 한 다음 사용자 지정 특성을 할당 처리 할 수있는 모델에 대한 초기화 기능. 당신이 원했던 것처럼 깨끗하고 단순한 해결책은 아니지만, 그 일을 성취해야합니다. 그리고 초기화 함수를 작성하여 모든 스키마 기반 특성을 대량 할당하고 self에있을 수있는 모든 특성과 함께 전달 된 나머지 키를 일치시킬 수 있다는 점에서 상당히 일반적인 방식으로 작성할 수 있습니다.

+0

정말입니까? 나는 다음과 같은 것을 발견했다. www.railsrocket.com/find_by_sql 그는 내가 할 수 있다고 말한다. – Tony

+0

죄송합니다. 나는이 기능을 인식하지 못했습니다. 사용하고 있던 버전이 꽤 오래 되었기 때문에 문제가되었을 수도 있습니다. 그러나이 기사에서 설명한대로 작동하면 질문은 정확히 무엇입니까? –

+0

질문은 그것이 작동하지 않는다는 것입니다. :). attr_accessor가 괜찮습니까? 속성에 어떻게 액세스 할 수 있습니까? – Tony