많은 데이터를 가져와 계산을 실행하고 큰 테이블의 일부로 침을 뱉어내는 보고서를 생성해야합니다. 이렇게하는 것은 어렵지 않습니다. 그러나 기존 방법을 사용하여 1000 가지 SQL 쿼리를 생성하지 않도록하는 것이 훨씬 더 어렵습니다. 이 달의 시작 부분에 말을 계정의 균형을 얻기 위해 사용될 수ActiveRecord를 사용하여 효율적으로 보고서 생성
def balance_at(time=Time.now)
payments_out = self.payments.where("created_at <= ?",time).sum("amount")
payments_in = self.payments_on_account.where("created_at <= ?",time).sum("amount")
payments_in - payments_out
end
, 그리고 마지막 :
는 예를 들어이 같은 방법이있는 Account
클래스가있을 수 있습니다. 그것은 위대한 작품.
그러나 모든 테이블을 Account
의 시작과 끝으로 균형을 유지하려면 바보가됩니다. 그래서 예를 들면 : (
Account.includes(:payments, :payments_on_account)
내가 루비의 모든 순수하게이 위기 원한다면 내가 원하는 것 모든 데이터를 얻을 것이다,하지만 내 좋은 작은 방법은 balance_at
루비에 재정 숫자를 모두하지 않습니다 그것은 개별적인 경우에 대해 느릴 것이다).
나는과 같이 캐시되는 내용에 따라 루비를하지 뭔가 SQL 그것을 해결할 수 :
def balance_at(time=Time.now)
payments_out, payments_in = [payments, payments_on_account].map{|payments|
if payments.loaded?
payments.find_all{|p| p.created_at < time }.inject(0){|a,p| p.amount + a }
else
payments.where("created_at <= ?",time).sum("amount")
end
}
payments_in - payments_out
end
그러나, 읽을 끔찍한 또는 중 하나를 테스트하기 쉽지 않다.
어떻게 해결하겠습니까?
보고서와를 할 때 그 다음 범위로 계산의 각 유형을 넣어 수 있는지 궁금 X, Y, Z를 사용하면 해당 범위를 간단히 연결할 수 있습니다. 복잡한 쿼리를 통해 서로 간섭하기 시작하는 특정 시점에 도달 할 수 있는지 여부는 알 수 없습니다. 아마도 보고서의 각 열은'find_by_sql' 또는 범위와 관련이 있습니다. 그리고 쉽게 테스트 할 수 있으며 열 당 쿼리 가격에 충돌이 없도록 보장 할 수 있습니다. – Theozaurus