2013-07-24 14 views
1

我目前有一個相當簡單的數據庫,它定期通過腳本進行更新。我想通過比較2列的相等來過濾結果。 SQL查詢看起來像: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 

每個腳本運行它追加新的設備條目,並更新了`時間:在位置表most_recent_updated_time場。以下是表格更新的一個例子。腳本運行

 
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

這將在後臺生成大量的查詢!我們不能在單個查詢中獲得同樣的結果嗎? –