我有一个迭代,用于创建包含项目的列。
Preference
belongs_to :option
Option
has_many :preferences
belongs_to :category
Category
has_many :options
因此,当我迭代首选项时,我希望能够按选项类别对它们进行分组。
<% @preferences.group_by { |p| p.choice.category_id }.each do |pref| %>
<div class="dutylog_column">
<div class="dutylog_column_header"><span><%= category(pref) %></span></div>
<ul class="dutylog_column_items">
<% @users_logs.each do |dutylog| %>
<li><%= dutylog.properties[pref.choice.try(:name)] %></li>
<% end %>
<%= content_tag :li, sum_column(pref.choice.try(:name)), class: "totals_row" if has_dutylogs? %>
<li class="new_dutylog_entry"><%= f.text_field pref.choice.name, id: pref.choice.name, class: "sum_number" unless pref.choice.name.blank? %></li>
</ul>
</div> <%# dutylog_column %>
<% end %>
div.dutylog_column是float:left;所以每次迭代都会创建一个像列一样的表。如果不对首选项进行分组,它们看起来是随机的。我想订购它们......将它们分组。
看起来我上面的例子应该可以工作......但是我得到了“未定义的方法'选项'。
在玩更多...我意识到这是由group_by返回并试图使用每个数组的各个属性的数组散列的问题。我已更新上面的代码以反映一些更改。问题在于我通过'pref'访问数组属性。
<%= dutylog.properties[pref.choice.try(:name)] %>
错误是抱怨选择关联。哪个工作正常,除非我使用group_by ...来改变迭代的输出。
答案 0 :(得分:1)
我只需要使用sort_by而不是group_by。
@preferences.sort_by { |p| p.choice.category.position }.each do |pref|