繁体   English   中英

Ruby Active Record在Ruby on Rails中返回关系

[英]Ruby Active Record returns relation in Ruby on rails

我有这个代码

@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

但是它们不起作用,因为它仍然返回我的关系而不是值,这给了我一条错误消息。

我怎么了 我该如何解决? 谢谢!

.find(:all, :conditions => <cond>)是查找一组活动记录的旧方法。 您现在应该改用where(cond) ,它应该对您更好。

where返回活动关系...,然后可以在其上使用final方法来提取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 %>
<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是一个哈希,因此first将给您哈希的第一个元素作为[key,value]的数组,当您发送到数组时,消息的最后一个将使您返回值对象,然后使用ID,您将获得要查找的ID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM