如何将2个Rails模型混合到单个查找中?

时间:2010-07-22 16:13:04

标签: ruby-on-rails ruby activerecord

我有两个不相关的模型(在db意义上)但有一些常见的列(名称,电子邮件等)。

Class Account < ActiveRecord::Base

end


Class LegacyAccount < ActiveRecord::Base

end

由于各种原因,我无法将这些合并到单个模型中或执行STI。但我想要一个简单的视图,在一个漂亮的表中显示两个模型的所有记录(可能按照“name”这样的公共字段排序)。

是否可以从两个模型进行查找/查询?或者,我可以执行两个查找并合并生成的数组,以便对它们进行排序吗?我可以使用一些中间模型来合并它们吗?

4 个答案:

答案 0 :(得分:6)

最简单的解决方案就是合并数组,然后只使用某种类型的Array排序方法:

@accounts = (LegacyAccount.all + Account.all).sort{|x,y| x.name <=> y.name}

您可以在Account模型中编写自定义查找方法,以便更轻松,这样您就可以调用Account.find_all或其他内容。


使用SQL还有另一种可能的解决方案:

@accounts = Account.find_by_sql("SELECT * FROM accounts UNION SELECT * FROM legacy_accounts")

这适用于纯SQL,但我不确定Rails。我的猜测是它会将所有LegacyAccounts视为普通帐户。我不确定如果LegacyAccounts具有Accounts还没有的列,会发生什么。

或者您可以尝试从这里开始: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html

后两种解决方案很棘手,所以如果你有一些非常具体的东西,我只会尝试它们。

答案 1 :(得分:1)

如果数据库无法加入它们,那么您可以定义一个合并记录并返回哈希值的Ruby对象。

class AccountView
  def self.find_all
    accounts = []
    Account.find(:all).each do |account|
      accounts << {:name => account.name, ... }
    end
    LegacyAccount.find(:all).each do |account|
      accounts << {:name => account.name, ... }
    end
    return accounts
  end
end

或者,在AccountView上定义属性并返回AccountView个对象的数组。

答案 2 :(得分:1)

这里我只有2美分用于网站RSS Feed:

(Model1.latest + Model2.latest).sort_by(&:created_at).reverse

答案 3 :(得分:-1)

@accounts = Account.find(:all, :include => :legacy_account)

或Rails3加入样式

@accounts = Account.all.joins(:legacy_account)