與我的最後一個問題在這裏:Rails: Finding all associated objects to a parent objectRails的排序子對象和顯示
是否有可能通過創建時間在Rails的多個獨立的子對象進行排序,然後列出他們呢?使用前面的例子,我有一個帶有兩個不同has_many子對象的簡歷,我想獲取它們,然後根據創建日期對它們進行排序,然後使用它來顯示它們。
與我的最後一個問題在這裏:Rails: Finding all associated objects to a parent objectRails的排序子對象和顯示
是否有可能通過創建時間在Rails的多個獨立的子對象進行排序,然後列出他們呢?使用前面的例子,我有一個帶有兩個不同has_many子對象的簡歷,我想獲取它們,然後根據創建日期對它們進行排序,然後使用它來顯示它們。
我假設你有兩個(或更多)單獨的模型子對象,所以你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對象選擇正確的部分。
您可以在父模型添加的存取方法:
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
由於子對象是不同類型的,他們分別取(獨立has_many
),你必須做在Ruby中排序:
sorted_childs=(@resume.child1_sections.all + @resume.child2_sections.all).sort(&:created_at)
否則,你需要引入父表中的常用列的表繼承。然後,有可能爲:order
的所有子女提供另一個has_many
。
謝謝!這看起來好像讓我走上了正軌。我非常感謝你的幫助。 – thedjpetersen 2010-09-24 11:28:10
謝謝你,這似乎已經成功了 – thedjpetersen 2010-09-28 19:27:49