我有两个不相关的模型(在db意义上)但有一些常见的列(名称,电子邮件等)。
Class Account < ActiveRecord::Base
end
Class LegacyAccount < ActiveRecord::Base
end
由于各种原因,我无法将这些合并到单个模型中或执行STI。但我想要一个简单的视图,在一个漂亮的表中显示两个模型的所有记录(可能按照“name”这样的公共字段排序)。
是否可以从两个模型进行查找/查询?或者,我可以执行两个查找并合并生成的数组,以便对它们进行排序吗?我可以使用一些中间模型来合并它们吗?
答案 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)