【问题标题】:Ruby on Rails: how to sort data in an array of active record objects right before iterating?Ruby on Rails:如何在迭代之前对活动记录对象数组中的数据进行排序?
【发布时间】:2014-07-29 00:11:28
【问题描述】:

按字段对 Active Record 对象数组进行排序的最佳方法是什么?

这个数组是一个对象的字段,link_pages,我希望它按字段“sequence”排序

<% @menu_bar.link_pages.each do |lp| %>
                <li id="page_<%= lp.id%>" class="ui-state-default">
                  <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>

                  <font size=5><%= lp.name %></font> | 
                  <%= link_to "remove",
                         :controller => "admin/menu_bars",
                         :action => :remove_page_from_menu,
                         :page => lp.id,
                         :id => @menu_bar.id %>
                </li>
          <% end %>

也许有一种方法可以做到@menu_bar.link_pages.sort_by_sequence.each do,这会很巧妙,但我就是不知道。

【问题讨论】:

  • 我认为是 2.3.8 版。默认不是 3

标签: ruby-on-rails


【解决方案1】:
@menu_bar.link_pages.sort_by { |e| e.sequence }.each do |lp|
  . . .

【讨论】:

  • @menu_bar.link_pages.sort_by &amp;:sequence.each do |lp|to_proc 的简写方式。另见this SO discussion
【解决方案2】:

link_pages真的是一个活动记录对象数组吗?

如果在视图中添加它会发生什么?

<%= debug @menu_bar.link_pages.class %>

可能会发生两件事。它可以打印“Array”,也可以打印“ActiverecordThing”(类似的东西,绝对不是Array)。

如果您真的有一个数组,请使用 DigitalRoss 的解决方案。如果你有一个“ActiverecordSomething”,那么,创建一个named_scope,这样你就可以轻松地重复使用:

# Assuming that your model name is "Page"
class Page < ActiveRecord::Base
  ...
  named_scope :sorted_by_sequence, :order => 'pages.sequence ASC'
  ...
end

那么你可以这样做:

<% @menu_bar.link_pages.sorted_by_sequence each do |lp| %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多