【问题标题】:How to get the all unique value using foreign key in Rails如何在 Rails 中使用外键获取所有唯一值
【发布时间】:2021-08-04 06:28:58
【问题描述】:

我有一个模型 sensor,它存储来自 Arduino 的环境数据(温度、湿度)。

create_table "sensors", force: :cascade do |t|
  t.integer "system_id"
  t.float "value"
  t.datetime "created_at"
end

我想获得所有设备的平均值。为此,我需要通过system_id 获取所有设备的最后一个值。

我想要得到的结果应该是这样的:

 [#<Sensor:0x0000556dd6a5c758
  id: 10,
  sensor_id: 1,
  value: 14.0,
  created_at: Sat, 31 Jul 2021 18:41:13 UTC +00:00,
 #<Sensor:0x0000556dd6a6f448
  id: 149,
  sensor_id: 2,
  value: 22.0,
  created_at: Sat, 31 Jul 2021 18:41:13 UTC +00:00,
 #<Sensor:0x0000556dd6a6f238
  id: 329,
  sensor_id: 3,
  value: 11.0,
  created_at: Sat, 31 Jul 2021 18:41:13 UTC +00:00,
  ...]

或者只是对应于任务条件的值数组:

[14.0, 22.0, 11.0]

我是这样尝试的:

Sensor.order('created_at DESC').distinct(:system_id)

但它不起作用。知道怎么做吗?

【问题讨论】:

  • 你在找Sensor.select("system_id, max(created_at) as created_at").group(:system_id)
  • @Eyeslandic 谢谢,是的,这几乎是我想要的,但结果是,没有我需要的值[ #&lt;Sensor:0x0000556dd86854e8 id: nil, service_id: 1, created_at: Sat, 31 Jul 2021 12:20:50 UTC +00:00&gt;, #&lt;Sensor:0x0000556dd86854e8 id: nil, service_id: 2...]

标签: sql ruby-on-rails postgresql ruby-on-rails-5.2


【解决方案1】:

你试试这个。

Sensor.order('created_at DESC').pluck(:system_id).uniq

【讨论】:

    【解决方案2】:

    你可以这样做。您可能需要稍微调整一下以完全适合您的情况。

    sensors = Sensor.select("system_id, max(created_at) as created_at").group(:system_id)
    
    # To get values from this you can do something like
    # This will give you an array like [[1, 2021-01-01], [2, 2021-01-01]]
    sensors.to_a.pluck(:system_id, :created_at)
    

    【讨论】:

      【解决方案3】:

      你可以试试这个来获取最新记录:

      Sensor.joins('INNER JOIN (SELECT system_id, MAX(created_at) AS max_date FROM sensors GROUP BY system_id) latestSensor ON latestSensor.system_id = sensors.system_id AND latestSensor.created_at = sensors.created_at')
      

      如果created_at 与这些记录完全相同,这可能会为system_id 返回多行。

      来源:https://stackoverflow.com/a/2411703/4207394

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-02
        • 2012-07-18
        • 2021-09-26
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多