簡體   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