我是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 []>
感谢帮助。
答案 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'])