【问题标题】:Ruby / Datamapper query comparing columns from different tablesRuby / Datamapper 查询比较不同表中的列
【发布时间】:2013-07-24 11:41:45
【问题描述】:

我目前有一个由脚本定期更新的相当简单的数据库。我想通过比较两列的相等性来过滤结果。 SQL 查询如下所示:

选择 devices.site_name、devices.device_name、devices.created_at FROM 设备、位置 其中 devices.created_at = locations.most_recent_updated_time AND devices.site_name = locations.site_name;

这是我的数据映射器模型

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 字段。下面是如何更新表的示例。

设备
╔════╦═════════════╦═══════════╦══════════════════ ═════════╗
║ ID ║ Device_Name ║ Site_Name ║ Created_at ║
╠════╬═════════════╬═══════════╬══════════════════ ═════════╣
║ 1 ║ 设备 1 ║ 达拉斯 ║ 2013-07-23T16:59:12-04:00 ║
║ 2 ║ 设备 2 ║ 达拉斯 ║ 2013-07-23T16:59:12-04:00 ║
║ 3 ║ Device3 ║ 芝加哥 ║ 2013-07-23T16:59:12-04:00 ║
╚════╩═════════════╩═══════════╩══════════════════ ═════════╝
地点
╔═══════════╦═══════════════════════════╗
║ Site_Name ║ Most_Recent_Updated_Time ║
╠═══════════╬═══════════════════════════╣
║ 达拉斯 ║ 2013-07-23T16:59:12-04:00 ║
║ 芝加哥 ║ 2013-07-23T16:59:12-04:00 ║
║ 波士顿 ║ 2013-07-23T16:59:12-04:00 ║
╚═══════════╩═══════════════════════════╝

脚本运行后

设备 ╔════╦═════════════╦═══════════╦══════════════════ ═════════╗ ║ ID ║ Device_Name ║ Site_Name ║ Created_at ║ ╠════╬═════════════╬═══════════╬══════════════════ ═════════╣ ║ 1 ║ 设备 1 ║ 达拉斯 ║ 2013-07-23T16:59:12-04:00 ║ ║ 2 ║ 设备 2 ║ 达拉斯 ║ 2013-07-23T16:59:12-04:00 ║ ║ 3 ║ Device3 ║ 芝加哥 ║ 2013-07-23T16:59:12-04:00 ║ ║ 4 ║ Device4 ║ 达拉斯 ║ 2013-07-24T18:00:00-04:00 ║ ║ 5 ║ Device5 ║ 芝加哥 ║ 2013-07-24T18:00:00-04:00 ║ ╚════╩═════════════╩═══════════╩══════════════════ ═════════╝ 地点 ╔═══════════╦═══════════════════════════╗ ║ Site_Name ║ Most_Recent_Updated_Time ║ ╠═══════════╬═══════════════════════════╣ ║ 达拉斯 ║ 2013-07-24T18:00:00-04:00 ║ ║ 芝加哥 ║ 2013-07-24T18:00:00-04:00 ║ ║ 波士顿 ║ 2013-07-24T18:00:00-04:00 ║ ╚═══════════╩═══════════════════════════╝

因此,如果我在脚本运行后运行查询,我希望它返回 Device4 和 Device5。

【问题讨论】:

  • 是的,这是一个错字。已修复,谢谢!也感谢您的帮助

标签: ruby sqlite datamapper


【解决方案1】:

如果我正确理解您的问题,请尝试将此方法添加到Location

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

那么您应该能够为每个Location 收集所有最新设备,如下所示:

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

【讨论】:

  • 这将在后台生成大量查询!我们不能在单个查询中实现相同的目标吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多