将两个ActiveRecord模型合二为一

时间:2014-02-20 22:51:04

标签: ruby-on-rails activerecord model

我正在开发的Rails应用程序有两个模型:ReviewInterview。它们本质上都是文章,但它们的属性和行为不同。

某些应用程序的页面需要一起显示评论和访谈,就像它们来自同一模型一样。这意味着我不知何故需要将它们组合到一个模型中,然后将所述模型用作“代理”。

通过使用以下代码实现Article模型,我实现了基本结果:

class Article
  MODELS = [Review, Interview]

  def self.fetch(&block)
    block = Proc.new { all } unless block_given?
    results = []

    MODELS.each do |model|
      suppress(StandardError) do
        results.push(*model.class_eval(&block))
      end
    end

    results
  end
end

这为我提供了我需要的基本功能。我现在可以使用类似Article.fetch { where("created_at >= ?", 10.days.ago.to_date) }的内容,同样的查询将在两个模型上运行,给我一系列结果(不按日期排序,但实际上是将评论和访谈组合在一起,因为它们来自两个不同的查询)。

这种方法似乎有效,但也有一些重要的缺点 一个重要的问题是,如果要对结果进行正确排序,必须在查询后手动实现任何类型的排序。

我实现自己的方法来解决我遇到的问题没有问题,但我想知道是否有更多的标准方法可以在Rails中实现这一点。

1 个答案:

答案 0 :(得分:1)

看看你的问题,你基本上有两个具有不同属性和行为的模型。

一种方法是创建一个父类,其子类继承自父类。

class Article

class Review < Article&amp; class Interview < Article

使用单表继承(STI)方法,您只需创建一个类型列,该列将区分两者,并根据子类填充验证和列。