【问题标题】:Combining arrays of different objects in RoR and sorting by a date value on a different attribute on each在 RoR 中组合不同对象的数组,并按每个对象上不同属性的日期值排序
【发布时间】:2013-04-14 02:59:08
【问题描述】:

我在 ruby​​ on rails 中有两个对象数组。我想组合它们并按两个不同的属性对它们进行排序。这可能吗?

一个是“Post”记录数组,一个是“Talk”记录数组。它们都需要按日期排序。但是对于 Post,相关属性是 created_at,而对于 Talk,它是 date_given。正是这种令人头疼的问题让我考虑取消这两种不同的模型,并用更灵活的 Post 模型替换它们。

任何想法都将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    我刚刚尝试了一些可行的方法,但不确定这是否是处理此问题的最佳方法。我只是为每个模型添加一个称为可排序日期的方法,并将其设置为我想要的。一个问题是 created_at 是 Time 而 date_given 是 DateTime,所以我用这篇文章来处理 Convert to/from DateTime and Time in Ruby

    talk.rb
    
    def sortable_date
      date_given
    end  
    
    post.rb
    
    def sortable_date
      created_at.to_datetime
    end  
    

    然后在我的控制器中 -

    @posts = Post.order('created_at DESC').limit(3)
    @talks = Talk.order('date_given DESC').limit(3)
    
    @news = @posts + @talks
    @news.sort_by! &:sortable_date
    @news = @news[1..4]
    

    我只是在我的视图中渲染@news,它很好地召唤了适当的部分。我希望得到一些反馈。

    【讨论】:

    • 这很好用,这正是我正在寻找的,感谢分享你如何解决它。
    【解决方案2】:
    posts = Post.all
    talks = Talk.all
    posts+talks.sort do |a,b|
       attr_a = a.kind_of?(Post) ? 'created_at' : 'date_given'
       attr_b = b.kind_of?(Post) ? 'created_at' : 'date_given'
       a.send(attr_a) <=> b.send(attr_b)
    end
    

    应该有一种 SQL 方式来做到这一点,但是,这种方式更简单。

    【讨论】:

    • 感谢您的回复。你以前有过这样的工作吗?我刚试了一下,得到了一个 ArgumentError - '与 Post 的比较失败'
    • 嗨,从来不需要它,但这应该有效,因为它不是将 Post 与 Talk 进行比较,而是将 send(attr_a) 结果与 send(attr_b) 结果进行比较。你能添加一些调试信息吗? (如错误行和该行变量的内容)
    • 刚刚在这里做了一个测试,似乎可以使用我工作数据库中的“updated_at”和“creation_time”
    • 嗯,我只是尝试了一种不同的方式,但遇到了一个信息更丰富的错误——我试图比较时间(post.created_at)和日期时间(talk.date_given)。我想知道这是否也是这里的问题。
    • 您可以在日期时间字段中使用.to_time,它应该可以工作。我很肯定我的回答方式也有效。
    猜你喜欢
    • 2021-07-15
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多