2011-03-29 3 views
1

내 SQL 기술이 우스꽝 스럽기 때문에 Rails와 ActiveRecord가 내 인생을 훨씬 쉽게 만들어줍니다. 그러나 이번에는 named_scope에 무엇을 먹일지를 알기 위해 백 엔드에서 무슨 일이 일어나고 있는지 이해하지 못하게하는 버팀대를 나타낼 것입니다.named_scope 관련 테이블의 열 합계

나는 게임에서 최고 득점 "배우"를 나타내는 테이블의 상위 10 개 레코드를 반환하려고합니다. 스코어는 Actor> Acts> Decsisons.point_value를 통해 계산됩니다.

모든 액터에 대한 점수를 쉽게 얻을 수 있지만 조인과 합계는 SQL 이해보다 높기 때문에 전체에서 상위 10 개를 스코어링합니다 db. 나는 현재 그것을 가지고 여기

는 액터 모델 :

class Actor < ActiveRecord::Base 
    has_many :acts, :dependent => :destroy 
    has_many :decisions, :through => :acts, :order => 'created_at' 

    named_scope :high_scores, { 
    :conditions => {:finished => true}, 
    :joins => "INNER JOIN acts ON actor.id = acts.actor_id INNER JOIN decisions on decision.id = decision.act_id", 
    :group => 'actor.id', 
    :select =>'actors.*, SUM(acts.decisions.point_value) AS score', 
    :order => "score DESC", 
    :limit => 10 
    } 

end 

여기에 몇 가지 게시물과 다른 사이트를 기반으로 몇 가지를 시도 후, 나는 분명히 파악하고 있지 않다 무슨 일인지 또는 무엇을 named_scope은 도트를 연결해야합니다. 일부 선명도가 많이 감사하겠습니다. 감사.

* 편집 : 덜 자원 집약적 인 것 같았다로 대신 테이블 열의

Mysql::Error: Unknown column 'acts.decisions.point_value' in 'field list': SELECT actors.*, SUM(acts.decisions.point_value) AS score FROM actors INNER JOIN acts ON actor.id = acts.actor_id INNER JOIN decisions on decision.id = decision.act_id WHERE (actors . finished = 1) GROUP BY actor.id ORDER BY score DESC LIMIT 10

+0

나는 당신이 정말로 복잡한 SQL 문을 가지기를 원한다면, 단지 execute 문을 사용하지 말고 클래스 함수에 묶어 두는 것이 좋습니다. 어쨌든 똑같지, 그렇지? 그냥 생각하면 – corroded

+0

당신이 똑같이 (그리고 ActiveRecord의 추상화 레이어가 거기에 가지 않을 것이기 때문에) 똑같이 잘 동작 할 것이라는 점에서 정확할 것입니다. 복잡한 SQL 문은 아무 것도 없습니다. 그게 바로 내 손을 잡을 레일즈 -y가 될 수 있기를 바랬던 이유입니다. 나는 그 자리에 있어야 할 곳에 나를 가져올 수있는 똑바로 세운 SQL 문을 분류 할 수 있는지 알아볼 것입니다. – John

+0

어쩌면 여기서 특정 진술을 요청할 수 있습니까? 나는 SQL 전문가가 아니며 실제로 복잡한 SQL 문을 실제 SQL 문으로 변환 할 수 있다고 생각했습니다. 어쨌든 그것은 내 상사가 일반적으로하는 것 (그는 또한 코더)이며 훨씬 더 효율적인 방법이라고 생각합니다. (조인은 느려지는 경향이 있습니다. 레일 랩퍼로도 마찬가지입니다) – corroded

답변

0

설정 최종 점수 : 나는 현재이 지금 나에게 다음과 같은 오류를 제공

이 무엇을 업데이트 named_scope .