与我的最后一个问题在这里: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