我有这段代码
@devices_data=Hash.new
@devices.each do |device|
@devices_data[device.id.to_s] = @project.vibration_data.find(:all, conditions: { vibration_device_id: device.id })
end
但是当我想在我的视图中显示数据时,请使用以下代码:
<p><%= @devices_data %></p> //this show whole block of data
<p><%= @devices_data.first.id%></p> // it says undefined method `id' for # Array:0x000000058b0150
如果我删除哈希容器,只需存储数据(如没有定义@device_data=Hash.new
)
@devices.each do |device|
@devices_data = @project.vibration_data.find(:all, conditions: { vibration_device_id: device.id})
end
<p><%= @devices_data.first.id%></p>
将显示其ID而不是错误消息。
但是我在每个设备中有超过1个数据,我需要一个数组或哈希来保存它。但这给了我一些问题。我尝试添加.first
以将代码设为
@devices_data[device.id.to_s] = @project.vibration_data.find(:all, conditions: { vibration_device_id: device.id }).first
我也尝试过更改查找数据的位置。
@devices_data[device.id.to_s] = @project.vibration_data.where(vibration_device_id: device.id ).first
但它们不起作用,在视图中仍然返回我的关系而不是值,这给了我一个错误信息。
我的问题是什么?我该如何解决?谢谢!
答案 0 :(得分:0)
.find(:all, :conditions => <cond>)
是查找一组活动记录的旧方法。您现在应该使用where(cond)
代替它,它应该更适合您。
where
会返回一个活动关系...然后您可以使用最终方法获取all
或仅提取符合您条件的first
项。
当你再申请first
时,它会将第一项从活动关系中拉出来 - 这似乎就是你想要的。
...但是,因为您将此值存储到哈希值中...然后您必须使用each
遍历哈希中的所有项目,或者再次使用first
取出你放入哈希的第一个项......
如下所示:
@devices_data = {}
@devices.each do |device|
@devices_data[device.id.to_s] = @project.vibration_data.where( vibration_device_id: device.id ).first
end
<% @devices_data.each do |device_id, device| %>
<p><%= device_id %></p>
<p><%= device.name %></p> <!-- or whatever -->
<% end %>
答案 1 :(得分:0)
<p><%= @devices_data.first.id%></p> // it says undefined method `id' for # Array:0x000000058b0150
给你一个错误,因为@devises_data.first会将哈希的第一项作为[key,value]
的数组带回来如果你尝试
<p><%= @devices_data.first.last.id%></p>
将打印你要查找的id,因为@devised_data是一个哈希,首先会给你哈希的第一个元素作为[key,value]的数组,当你发送给数组时,最后的消息将给出你支持值对象,然后使用id你将获得你正在寻找的id