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
}).
:
내가 잘못 입력하지 않은 경우 작은 따옴표로 묶인 문자열은 보간되지 않으므로 대체가 제대로 작동하려면 큰 따옴표로 묶어야합니다. –
이것은 SQL 주입 공격 벡터로 사용할 수 있습니다. 예를 들어 user_id가 '; 드롭 테이블 사용자; - '테이블을 떨어 뜨릴 수 있습니다. 이렇게하면 매우 심하게 끝날 수 있으므로 조심하십시오. – Rtype