내 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
나는 당신이 정말로 복잡한 SQL 문을 가지기를 원한다면, 단지 execute 문을 사용하지 말고 클래스 함수에 묶어 두는 것이 좋습니다. 어쨌든 똑같지, 그렇지? 그냥 생각하면 – corroded
당신이 똑같이 (그리고 ActiveRecord의 추상화 레이어가 거기에 가지 않을 것이기 때문에) 똑같이 잘 동작 할 것이라는 점에서 정확할 것입니다. 복잡한 SQL 문은 아무 것도 없습니다. 그게 바로 내 손을 잡을 레일즈 -y가 될 수 있기를 바랬던 이유입니다. 나는 그 자리에 있어야 할 곳에 나를 가져올 수있는 똑바로 세운 SQL 문을 분류 할 수 있는지 알아볼 것입니다. – John
어쩌면 여기서 특정 진술을 요청할 수 있습니까? 나는 SQL 전문가가 아니며 실제로 복잡한 SQL 문을 실제 SQL 문으로 변환 할 수 있다고 생각했습니다. 어쨌든 그것은 내 상사가 일반적으로하는 것 (그는 또한 코더)이며 훨씬 더 효율적인 방법이라고 생각합니다. (조인은 느려지는 경향이 있습니다. 레일 랩퍼로도 마찬가지입니다) – corroded