Ruby on rails 如何组合ActiveRecord对象?

Ruby on rails 如何组合ActiveRecord对象?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我想知道是否有一种有效的方法来组合Rails中多个ActiveRecord对象的结果。例如,我可能对三个单独的表进行三个单独的调用,我希望结果合并,并按公共列排序 下面是一个超级基本的代码示例,希望能让我的问题更容易理解: @results1 = Table1.find(:all) @results2 = Table2.find(:all) @results3 = Table3.find(:all) @combined_results_sorted_by_date_column =

我想知道是否有一种有效的方法来组合Rails中多个ActiveRecord对象的结果。例如,我可能对三个单独的表进行三个单独的调用,我希望结果合并,并按公共列排序

下面是一个超级基本的代码示例,希望能让我的问题更容易理解:

@results1 = Table1.find(:all)  
@results2 = Table2.find(:all)  
@results3 = Table3.find(:all)  

@combined_results_sorted_by_date_column = (how?)
正如其他人所建议的,这里有一个解决问题的方法

@combined_results = @result1 + @result2 + @result3
@combined_results.sort! {|x,y| x.date <=> y.date}
@combined_results=@result1+@result2+@result3
@组合结果。排序!{| x,y | x.date y.date}

如果我想按日期排序,但表3将“created_on”列称为日期,该怎么办

您不使用“表”,而是使用对象

如果你这样想的话,那就没有意义了:

@results1 = Users.find(:all)
@results2 = Posts.find(:all)
@results3 = Comments.find(:all)
它的“组合”形式意味着什么

您可能想要的是使用不同的“查询”组合来自同一类的结果。 是吗?

@results1=Table1.find(:all)
@combined_results = @result1 + @result2 + @result3
@combined_results.sort! {|x,y| x.date <=> y.date}
@结果2=表2.查找(:全部) @结果3=表3.查找(:全部) 组合=(@results1+@results2+@results3)。排序{x,y{x.date y.date}
如果我想按日期排序,但表3将“created_on”列称为日期,该怎么办

class Table3
  alias_method :date, :created_on
end
或者干脆

class Table3
  alias date created_on
end

我不确定您的数据量是什么样的,但在排序方面,您的数据库将比使用“应用程序层”代码做得更好

您是否需要以模型对象数组的形式返回数据,因为这三个表可能会生成三个不同模型类的混合数组


为什么不使用直接SQL返回行和列,并让DB对数据进行所有艰苦的排序工作?

您可能不会喜欢这个答案,但我认为您可能需要修改数据库架构。我也遇到过类似的情况,在连接结果之后对结果进行排序肯定不是您想要的方式

我假设您想要一个由三种不同类型的ActiveRecord对象组成的混合数组,按某种日期排序

@array = (Bucket.all + Mop.all + Detergent.all).sort{|x,y| x.sort_by <==> y.sort_by}
@array=(Bucket.all+Mop.all+delicient.all)。排序{x,y{x.sort_by y.sort_by}
由于每个对象类型的“排序依据”字段不同,因此需要对其进行定义

class Bucket < ActiverRecord::Base
  def sort_by
    cleaned_on
  end
end

class Detergent < ActiverRecord::Base
  def sort_by
    purchased_on
  end
end
class Bucket

您可以使用UNION在单个查询中提取所有已排序的数据,但无法从中提取AR对象。

如果我想按日期排序,但表3将“created_on”列引用为日期,该怎么办?非常感谢!你可以通过在表3中添加一个“date()”方法来解决这个问题,该方法返回“created_on”的值。我相信你,但是你能更具体地描述一下你是如何处理这种情况的吗?我有一个用例,组合注释,状态,并在问题管理应用程序中提交时间线。在这种情况下,它们都必须响应特定的接口,或者有一种方法映射到一个接口。关键的一点是,从“数据库表”的角度来考虑这一点会使您陷入糟糕的设计中。我不是想暗示你不使用来自不同地方的数据,只是问你如何处理/思考它。
class Table3
  alias date created_on
end
@array = (Bucket.all + Mop.all + Detergent.all).sort{|x,y| x.sort_by <==> y.sort_by}
class Bucket < ActiverRecord::Base
  def sort_by
    cleaned_on
  end
end

class Detergent < ActiverRecord::Base
  def sort_by
    purchased_on
  end
end