.where与Rails模型进行比较的查询返回一个空关系

时间:2014-12-09 03:08:38

标签: ruby-on-rails ruby-on-rails-4

我是Rails noob,这是我的第一篇SO帖子。请耐心等待:)

我有一个名为"设备"的Rails模型。存储有关设备的大量信息。很多信息都存储在序列化哈希中,因为我认为我不需要这些信息。但不幸的是现在我这样做了,所以我使用以下方法提取了我需要的两条信息属性。请原谅那些我打算让它更具可读性的代码:)

来自schema.rb:

t.float    "charge_left"
t.float    "available_capacity"

来自device.rb

def charge_left
  ((details['BatteryLevel'].to_f)*100).round
end

def available_capacity
  (((details['AvailableDeviceCapacity'].to_f.round(2))/(details['DeviceCapacity'].to_f.round(2))) * 100).round
end

现在我需要查找具有available_capacity且剩余电量小于10的设备。但即使存在具有所需属性范围的设备,我也会为每个可能的查询获得空关系。

irb(main):008:0> Device.first.charge_left
=> 66
irb(main):009:0> Device.where('charge_left > ?', 10)
=> #<ActiveRecord::Relation []>

irb(main):007:0> Device.first.available_capacity
=> 7
irb(main):006:0> Device.where('available_capacity < ?', 10)
=> #<ActiveRecord::Relation []>

感谢帮助。

1 个答案:

答案 0 :(得分:0)

在我看来,使用charge_left作为实例方法属性的名称。因此,当您调用Device.first.charge_left时,它将返回实例方法的值而不是数据库列。您只能使用.where根据属性值而不是实例方法来制定查询。

您应该编写一个实例方法来设置charge_left

def set_charge_left(available_capacity, device_capacity)
  self.charge_left = ((available_capacity.to_f.round(2))/(device_capacity.to_f.round(2))) * 100).round
  self.save!
end

然后在您的控制器中(您可以访问您的参数),您可以这样调用它:

set_charge_left(details['AvailableDeviceCapacity'], details['DeviceCapacity'])