【问题标题】:Rails sorting child objects and displayingRails 对子对象进行排序和显示
【发布时间】:2011-04-16 14:49:03
【问题描述】:

关于我的最后一个问题:Rails: Finding all associated objects to a parent object

是否可以在 Rails 中按创建日期对多个单独的子对象进行排序,然后列出它们?使用前面的示例,我有一个包含两个不同 has_many 子对象的简历,我想获取它们,然后根据创建日期对它们进行排序,然后使用它来显示它们。

【问题讨论】:

    标签: ruby-on-rails sorting associations


    【解决方案1】:

    我假设您有两个(或更多)单独的子对象模型,因此您的 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 %>
    

    它应该会自动找到应该使用哪个partial,但是只有按照Rails的方式才能使用。如果您想以不同的方式命名部分,或者将其存储在不同的目录中,那么您必须编写自己的方法,这些方法将根据类型 od 对象选择正确的部分。

    【讨论】:

    • 谢谢!这看起来让我走上了正确的轨道。非常感谢您的帮助。
    【解决方案2】:

    您可以在父模型上添加访问器方法:

    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
    

    【讨论】:

    【解决方案3】:

    由于子对象的类型不同,并且它们是单独获取的(单独的has_many),因此您必须在 Ruby 中进行排序:

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

    否则,您需要在父级中引入具有公共列的表继承。那么就可以为所有:order 的孩子再创建一个has_many

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2015-06-20
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多