2013-07-24 2 views
1

현재 스크립트로 정기적으로 업데이트되는 매우 간단한 데이터베이스가 있습니다. 2 열의 평등을 비교하여 결과를 필터링하고 싶습니다. 위치 테이블에 most_recent_updated_time 필드 :다른 테이블의 열을 비교하는 Ruby/Datamapper 쿼리

 
SELECT devices.site_name, devices.device_name, devices.created_at 
FROM devices, locations 
WHERE devices.created_at = locations.most_recent_updated_time AND devices.site_name = locations.site_name; 

여기 스크립트는 새 장치 항목을 추가하고`를 업데이트 실행될 때마다 내 datamapper 모델

class Device 
    include DataMapper::Resource 

    property :id, Serial 
    property :device_name, Text, :required => true 
    property :site_name, Text, :required => true 
    property :created_at, DateTime 

    belongs_to :location 

end 

class Location 
    include DataMapper::Resource 

    property :site_name, Text, :required => true, :key => true 
    property :most_recent_updated_time, DateTime, :required => true 

    has n, :devices 
end 

입니다 : 같은 SQL 쿼리가 보일 것이다. 다음은 테이블이 업데이트되는 방법에 대한 예입니다. 스크립트가 실행 된 후 나는 쿼리를 실행하면 스크립트 실행

 
Devices 
╔════╦═════════════╦═══════════╦═══════════════════════════╗ 
║ ID ║ Device_Name ║ Site_Name ║  Created_at   ║ 
╠════╬═════════════╬═══════════╬═══════════════════════════╣ 
║ 1 ║ Device1  ║ Dallas ║ 2013-07-23T16:59:12-04:00 ║ 
║ 2 ║ Device2  ║ Dallas ║ 2013-07-23T16:59:12-04:00 ║ 
║ 3 ║ Device3  ║ Chicago ║ 2013-07-23T16:59:12-04:00 ║ 
║ 4 ║ Device4  ║ Dallas ║ 2013-07-24T18:00:00-04:00 ║ 
║ 5 ║ Device5  ║ Chicago ║ 2013-07-24T18:00:00-04:00 ║ 
╚════╩═════════════╩═══════════╩═══════════════════════════╝ 
Location 
╔═══════════╦═══════════════════════════╗ 
║ Site_Name ║ Most_Recent_Updated_Time ║ 
╠═══════════╬═══════════════════════════╣ 
║ Dallas ║ 2013-07-24T18:00:00-04:00 ║ 
║ Chicago ║ 2013-07-24T18:00:00-04:00 ║ 
║ Boston ║ 2013-07-24T18:00:00-04:00 ║ 
╚═══════════╩═══════════════════════════╝ 

그래서, 내가 좋아하는 것

Devices 
╔════╦═════════════╦═══════════╦═══════════════════════════╗ 
║ ID ║ Device_Name ║ Site_Name ║  Created_at   ║ 
╠════╬═════════════╬═══════════╬═══════════════════════════╣ 
║ 1 ║ Device1  ║ Dallas ║ 2013-07-23T16:59:12-04:00 ║ 
║ 2 ║ Device2  ║ Dallas ║ 2013-07-23T16:59:12-04:00 ║ 
║ 3 ║ Device3  ║ Chicago ║ 2013-07-23T16:59:12-04:00 ║ 
╚════╩═════════════╩═══════════╩═══════════════════════════╝ 
Location 
╔═══════════╦═══════════════════════════╗ 
║ Site_Name ║ Most_Recent_Updated_Time ║ 
╠═══════════╬═══════════════════════════╣ 
║ Dallas ║ 2013-07-23T16:59:12-04:00 ║ 
║ Chicago ║ 2013-07-23T16:59:12-04:00 ║ 
║ Boston ║ 2013-07-23T16:59:12-04:00 ║ 
╚═══════════╩═══════════════════════════╝ 

후에는 Device4 및 Device5를 반환합니다. 내가 제대로 질문을 이해한다면

+0

그래, 그것은 오타였습니다. 고침, 고마워! 도움을 주셔서 감사합니다 – Eric

답변

0

, Location에이 방법을 추가하려고 :

def most_recent_devices 
    devices.all(:created_at => most_recent_updated_time) 
end 

이 그럼 당신은 모든 최신 장비를 수집 할 수 있어야한다 각 Location과 같이 :

Location.all.map(&:most_recent_devices).flatten 
+0

이것은 백그라운드에서 많은 검색어를 생성 할 것입니다! 단일 쿼리에서 동일한 결과를 얻을 수 있습니까? –