在数据库中存储类名以模仿设计模式 - Ruby on Rails

时间:2014-10-01 08:56:01

标签: ruby-on-rails ruby design-patterns

我正在寻找在我的一个项目中实施战略设计模式。基本上我必须在由数据库中的单个字段区分的对象上调用方法,这种差异将确保不同的方法行为。

经过一番研究,我发现红宝石很少需要设计模式,而且它使用鸭子打字。现在要实现相同的效果,我正在考虑将类名存储在数据库中,并在需要时调用该类的方法。像这样,

duckOne = Duck.find(id)
duckOne[:className].fly(duckOne) #This scenario is same as Class.fly,but class is coming from db

duckTwo = Duck.find(id)
duckTwo[:className].fly(duckTwo) #Similar to above, just a different class from database

有更好的方法吗?这种方法是否正确?

1 个答案:

答案 0 :(得分:1)

基本上,根据您的描述,我认为您正在寻找Single Table Inheritance (STI)(您可能需要滚动查找信息)。

使用STI,您可以使用一个数据库表来表示从同一个超类派生的多个类。 Rails使用一个名为type的列来知道将db行解释为哪个类。

您仍然可以在超类上使用find方法来查找各种子类化模型。

例如:

class Bird < ActiveRecord::Base
  def quack
    "quack"
  end
end

class Duck < Bird
  def quack
    "foo"
  end
end

class Goose < Bird
  def quack
    "bar"
  end
end

duck = Duck.create
goose = Goose.create

Bird.find(duck.id).quack
# => "foo"
Bird.find(goose.id).quack
# => "bar"