我有这个密码
@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而不是错误消息。但是我在每个设备中有超过一个数据,我确实需要一个数组或哈希来保存这个数据。但是这给我带来了问题,我尝试添加.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但是它们不起作用,在视图中,它仍然返回给我关系而不是值,这给了我一个错误信息。
我有什么问题?我该怎么解决呢?谢谢!
发布于 2014-11-12 04:10:19
<p><%= @devices_data.first.id%></p> // it says undefined method `id' for # Array:0x000000058b0150给出一个错误,因为@devises_data.first将把哈希的第一项作为键值数组返回。
如果你尝试
<p><%= @devices_data.first.last.id%></p>将打印您要查找的id,因为@devised_data是一个散列,首先将哈希的第一个元素作为键数组( value ),当您向数组发送消息时,最后将返回值对象,然后使用id获取您要查找的id。
发布于 2014-11-12 04:06:10
.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 %>https://stackoverflow.com/questions/26879020
复制相似问题