2011-04-28 6 views
1

죄송합니다. 그 질문이 이상하게 들리지만 나는 레일즈로 뛰어 들고 있습니다. 나는 아직도 전문 용어를 배우고 있습니다. 기본적으로 쿼리의 계산에서 모델의 특성 중 하나의 값을 사용하는 단일 패스 쿼리를 만들려고합니다 (가능한 경우).레일 3 : 쿼리에서 모델의 속성에 액세스 할 수 있습니까?

Tournamentstart_date 속성이 DateTime 인 모델이 있습니다. 1 시간보다 오래 걸리지 않은 start_date 또는 토너먼트의 길이를 가진 모든 토너먼트를 반환하는 쿼리를 만들려고합니다. 또는 다른 방법으로, 아직 시작하지 않았거나 시작했지만 아직 시작하지 않은 모든 토너먼트를 반환합니다. 한 시간 전에 끝났다. 작동하지 않는 나의 현재 쿼리, ... 이런 식으로 duration_in_mins는 토너먼트 모델의 정수 속성입니다

validTourneys = Tournament.where("start_date > (? - duration_in_mins)", (DateTime.now.utc - 1.hour)) 

을 보이지만,이 쿼리가 작동하지 않으며 모든 토너먼트를 반환 할 것 같다 항상. 계산의 (DateTime.now.utc - 1.hour) 부분에 duration_in_mins을 포함하고 싶습니다. 그러나 그것을 참조하는 방법을 모르므로, 나는 그것을 쿼리의 문자열 부분에 포함 시켰습니다. 나는 올바른 길을 가고 있는가?

저는 SQLite를 개발 용으로, PostgreSQL을 프로덕션 용으로 사용하고 있습니다.

지혜를 주셔서 감사합니다.

답변

2

DateTime 개체에서 분을 빼면 분과 일을 뺀 것이 아니라는 것이 문제입니다.

# This works as expected 
dt = DateTime.now # Thu, 28 Apr 2011 09:55:14 +0900 
an_hour_ago = dt - 1.hour # Thu, 28 Apr 2011 08:55:14 +0900 

# But, this does not... 
two_hours_in_minutes = 120 
two_hours_ago = dt - two_hours_in_minutes # Wed, 29 Dec 2010 09:55:14 +0900 

마지막 예제에서는 분 대신 120 일을 뺍니다. 이것은 아마도 당신의 질문에서도 일어날 수 있습니다. duration_in_minutes을 일로 변환 한 다음 빼십시오.

1

나는 당신의 질문에 직접 답하는 것에 대해 충분히 알지 못한다. (아마도 이것은 당신이 사용하고있는 데이터베이스에 달려 있다고 생각할 것이다.)

start_dateduration_in_mins 대신 DateTime 열로 start_dateend_date을 사용하셨습니까? 이것이 일반적인 쿼리 일 경우, 코드를보다 쉽게 ​​읽고 이해할 수있을뿐만 아니라 성능을 향상시킬 수 있습니다.

1

이 쿼리는 데이터베이스가 (내가 가정하는) DateTime 및 정수를 추가하는 방법을 알기에 충분히 똑똑한 경우에만 작동합니다. 그리고 내가 코딩 한 방식대로 올바르게 수행 할 데이터베이스는 생각할 수 없습니다. 어떤 데이터베이스도 분을 가정하지 않습니다. 일부는 틱, 초 또는 일을 수행 할 수 있습니다.

계산의이 부분

(? - duration_in_mins) 

하지 루비 땅에서, 데이터베이스에 일어날 것입니다.

관련 문제