在RoR中组合不同对象的数组,并按每个对象的不同属性上的日期值排序



我有两个ruby on rails中的对象数组。我想把它们组合起来,按两个不同的属性排序。这可能吗?

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

我只是尝试了一些工作,但我不确定这是否是处理这个问题的最佳方法。我只是向每个模型添加了一个名为sortable date的方法,并将其设置为我想要的值。一个问题是,created_at是一个时间和date_given是DateTime,所以我用这篇文章来处理转换到/从Ruby中的DateTime和Time

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在我的视图,它召唤适当的部分很好。

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的方法来做到这一点,但是,这种方法更简单。

最新更新