关于我在上一期的问题:Rails: Finding all associated objects to a parent object
是否可以按创建日期在Rails中对多个单独的子对象进行排序,然后列出它们?使用前面的示例我有一个包含两个不同的has_many子对象的简历,我想获取它们,然后根据创建日期对它们进行排序,然后使用它来显示它们。
答案 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
。