2011-04-24 2 views
1

SQLite는에 다음 (이미 간체) 쿼리를 보내기 문은 그들 중 일부는이 USER_ID 데르의 partner_id인지에 따라 달라 때Rails3/ActiveRecord : 매개 변수가있는 합계를 선택 하시겠습니까?

def self.calculate(year, month, user_id, partner_id) 
    where(':user_id = entries.user_id OR :partner_id = entries.user_id', {  
     :user_id => user_id, 
     :partner_id => partner_id 
    }). 
    where('entries.date <= :last_day', { 
     :last_day => Date.new(year, month, 1).at_end_of_month 
    }). 
    select('sum(case when joint = "f" and user_id = :user_id then amount_calc else 0 end) as sum_single' , {  
     :user_id => user_id 
    }). 
    group("strftime('%Y-%m', date)") 
end 

전체 쿼리가 다른 경우 더 많은 금액을 가지고있다. 불행하게도, Rails는 select가 두 번째 매개 변수를 어디에서와 같은 대입으로 사용하지 않기 때문에 불평합니다. user_id와 partner_id에 각각 하나씩 두 개의 쿼리를 실행하지 않고 원하는 것을 얻을 수있는 방법이 있습니까?

select('sum(case when joint = "f" and user_id = ' + user_id.to_s + ' then amount_calc else 0 end) as sum_single'). 

아무도 대답 없기 때문에,이 아카이브 :

입니다 : 그냥 문자열을 구축

select('sum(case when joint = "f" and user_id = :user_id then amount_calc else 0 end) as sum_single' , {  
    :user_id => user_id 
}). 

:

답변

-1

하나는 대신 .... 그래서 장님이 될 수 있습니다 편집 : 죄송합니다, 조심 : 아래에 명시된 바와 같이, 이것은 취약합니다.

+0

내가 잘못 입력하지 않은 경우 작은 따옴표로 묶인 문자열은 보간되지 않으므로 대체가 제대로 작동하려면 큰 따옴표로 묶어야합니다. –

+3

이것은 SQL 주입 공격 벡터로 사용할 수 있습니다. 예를 들어 user_id가 '; 드롭 테이블 사용자; - '테이블을 떨어 뜨릴 수 있습니다. 이렇게하면 매우 심하게 끝날 수 있으므로 조심하십시오. – Rtype

관련 문제