0

我希望这段代码输出当前和下一个维度成员的名称,其中 next 由每个维度成员的 absorder 属性定义。

<% @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

那么我将如何获得由特定属性 absorder 定义的下一个维度成员?

4

2 回答 2

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 %>
于 2013-02-09T22:39:16.083 回答
0

您可以使用以下方法访问数组的下一个元素next

<% @dimension_members.each_with_index do |dm, index| %>
    <p><%= dm.name %></p>
    <p><%= @dimension_members[index + 1].name %></p>
<% end %>

这是您要查找的内容,还是@dimension_members尚未按此“absorder”属性排序?如果没有,也许您应该在迭代之前对其进行排序。

于 2013-02-09T22:37:12.870 回答