2

조건을 충족하는 레코드 만 모델에서 가져온 조건을 추가하려고합니다. 예를 들어, :price이 0보다 크거나 같지 않은 트랜잭션 모델의 레코드 만 잡으려고합니다. (> 및! =하지만 아래 예제에서는 작동하지 않았습니다.)활성 레코드 레일 조건 3

price = Transaction.where(:company_id => company).where(:price != 0.00) 

나는 또한이 시도했다 : 그 위의 두

price = Transaction.where(:company_id => company).where(:price != 0.00).collect{|item| if item.price.to_f > 0.00 {item.price.to_f} end} 

...뿐만 아니라 다른 변화가 작동하지 않았다.

위의 첫 번째 예에서는 오류가 발생하지 않지만 단순히 작동하지 않습니다. 조건은 무시됩니다. 두 번째 예는 구문 오류를 생성합니다.

나는 SQL에서 조건문을 사용하여이 작업을 수행하는 방법이 있지만 그 방법을 알지 못한다고 확신한다.

제안 사항?

답변

13

이 :

.where(:price != 0.00) 

는 말과 동일합니다 : 상징으로

.where(true) 

은 플로트와 동일하지 않습니다; where(true)은 단지 데이터베이스의 실제 리터럴 (PostgreSQL의 경우 't', SQLite 및 MySQL의 경우 1)을 WHERE 절에 추가하기 때문에 아무런 의미가 없습니다.
Transaction.where(:company_id => company).where(:price != 0.00) 

는 다음 SQL은 PostgreSQL의에서이 같이 끝날 것이다 : 예를 들어, 당신은 말할

select * from transactions where company_id = #{company} and 't' 

을하고 쿼리가있을 때 단지

select * from transactions where company_id = #{company} 

의 말 동일합니다 당신을 혼란스럽게 할 때 때때로 레일스 콘솔에 .to_sql을 추가하고 SQL이 끝나는 것을 확인하는 것이 도움이된다. (그리고 SQL을 모른다면 관계형 모든 용량의 데이터베이스).

당신은 데이터베이스에 대한 비교를 보내려면, 루비 내부에 그것을하지 :

price = Transaction.where(:company_id => company) 
        .where('price != ?', 0) 

을 나는 당신의 price 열은 부동 소수점 타입보다는 소수 유형이 있으리라 믿고있어; 내가 틀렸다면 지금 바로 소수로 변경하십시오.

+0

나는 SQL에 대해 많은 것을 배웠다. 이것은 굉장합니다! 고맙습니다! – mmichael

+0

@mmichael : 네가 관계형 데이터베이스를 사용한다면 SQL에서 벗어날 수 없다. 뒤에서 무슨 일이 벌어지는지를 알면 문제를 분류하는 것이 훨씬 쉽다. –

관련 문제