2010-09-24 73 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