我希望此代码输出当前和下一个维度成员的名称,其中next由每个维度成员的吸收器属性定义。
<% @dimension_members.each do |dm| %>
<p><%= dm.name %></p>
<p><%= DimensionMember.where(:absorder => dm.absorder+1).name %></p>
<% end %>
相反,代码返回当前维度成员的名称,然后为每个下一个成员返回“DimensionMember”。
以下代码生成#<ActiveRecord::Relation:0x3f952e0>
:
<% @dimension_members.each do |dm| %>
<p><%= dm.name %></p>
<p><%= DimensionMember.where(:absorder => dm.absorder+1) %></p>
<% end %>
我必须想象有一种更容易的方法来返回数组中的下一个成员,但我无法让它工作。我考虑过这个想法尝试了以下代码,但它产生了#<DimensionMember:0x3f943f8>
:
<% @dimension_members.each do |dm| %>
<p><%= dm.name %></p>
<p><%= @dimension_members[dm.absorder+1] %></p>
<% end %>
最后,我试过这个:
<% @dimension_members.each do |dm| %>
<p><%= dm.name %></p>
<p><%= @dimension_members[dm.absorder+1].name %></p>
<% end %>
但是这会返回错误:
undefined method 'name' for nil:NilClass
那么我如何获得下一个dimension_member,其中next由特定属性吸收器定义?
答案 0 :(得分:1)
你得到奇怪结果的原因是因为where查询返回了一个关系/集合而不是单个对象。您只需要从查询中获取第一个对象:
DimensionMember.where(:absorder => dm.absorder+1).first.try(:name)
...
<% @dimension_members.each do |dm| %>
<p><%= dm.name %></p>
<p><%= DimensionMember.where(:absorder => dm.absorder+1).first.try(:name) %></p>
<% end %>
答案 1 :(得分:0)
您可以使用next
访问数组的下一个元素:
<% @dimension_members.each_with_index do |dm, index| %>
<p><%= dm.name %></p>
<p><%= @dimension_members[index + 1].name %></p>
<% end %>
这是您要找的,还是@dimension_members
尚未按此“吸收”属性排序?如果没有,也许您应该在迭代之前对其进行排序。