Rails排序子对象并显示

时间:2010-09-24 05:42:51

标签: ruby-on-rails sorting associations

关于我在上一期的问题:Rails: Finding all associated objects to a parent object

是否可以按创建日期在Rails中对多个单独的子对象进行排序,然后列出它们?使用前面的示例我有一个包含两个不同的has_many子对象的简历,我想获取它们,然后根据创建日期对它们进行排序,然后使用它来显示它们。

3 个答案:

答案 0 :(得分:3)

我假设您有两个(或更多)单独的子对象模型,因此您的Parent模型如下所示:

class Parent < ActiveRecord::Base
  has_many :dogs
  has_many :cats
end

要对它们进行排序并将它们作为children进行排序,您可以编写方法(类似于@gertas答案):

def children
  @children ||= (self.dogs.all + self.cats.all).sort(&:created_at)
end

并将其放入Parent模型中。然后你可以在控制器中使用它:

@parent = Parent.find(params[:id])
@children = @parent.children

现在我们将尝试在视图中显示它们。我假设您为每个模型_cat.html.erb_dog.html.erb创建了两个部分。在视图中:

<h1>Children list:</h1>
<% @parent.children.each do |child| %>
  <%= render child %>
<% end %>

它应该自动找到应该使用的部分,但只有在遵循Rails方式时才能使用它。如果你想以不同的方式命名部分,或者将它存储在不同的目录中,那么你必须编写自己的方法,根据类型od对象选择正确的部分。

答案 1 :(得分:1)

您可以在父模型上添加访问者方法:

class Parent < ActiveRecord::Base
  def sorted_children
    children.scoped( :order => 'created_at DESC' )
    # or, in rails3:
    # children.order('created_at DESC')
  end
end

如果您的子模型的自然顺序是日期字段,并且您希望在任何地方都这样做,那么只需在其上设置默认范围:

class Child < ActiveRecord::Base
  default_scope :order => 'created_at DESC'
end

答案 2 :(得分:1)

由于子对象具有不同的类型并且它们是单独提取的(单独的has_many),因此您必须在Ruby中进行排序:

sorted_childs=(@resume.child1_sections.all + @resume.child2_sections.all).sort(&:created_at)

否则,您需要在父级中引入具有公共列的表继承。然后,对于has_many的所有孩子,可能会有另一个:order