2010-09-24 39 views

回答

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

应该automaticaly找到这部分应该使用,但它只能如果你遵循Rails的方式来使用。如果您想以不同的方式命名partials,或将其存储在不同的目录中,则必须编写自己的方法,以便根据类型od对象选择正确的部分。

+0

谢谢!这看起来好像让我走上了正轨。我非常感谢你的帮助。 – thedjpetersen 2010-09-24 11:28:10

+0

谢谢你,这似乎已经成功了 – thedjpetersen 2010-09-28 19:27:49

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 
1

由于子对象是不同类型的,他们分别取(独立has_many),你必须做在Ruby中排序:

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

否则,你需要引入父表中的常用列的表继承。然后,有可能为:order的所有子女提供另一个has_many