我正在开发的Rails应用程序有两个模型:Review
和Interview
。它们本质上都是文章,但它们的属性和行为不同。
某些应用程序的页面需要一起显示评论和访谈,就像它们来自同一模型一样。这意味着我不知何故需要将它们组合到一个模型中,然后将所述模型用作“代理”。
通过使用以下代码实现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中实现这一点。
答案 0 :(得分:1)
看看你的问题,你基本上有两个具有不同属性和行为的模型。
一种方法是创建一个父类,其子类继承自父类。
class Article
class Review < Article
&amp; class Interview < Article
使用单表继承(STI)方法,您只需创建一个类型列,该列将区分两者,并根据子类填充验证和列。