我正在寻找在我的一个项目中实施战略设计模式。基本上我必须在由数据库中的单个字段区分的对象上调用方法,这种差异将确保不同的方法行为。
经过一番研究,我发现红宝石很少需要设计模式,而且它使用鸭子打字。现在要实现相同的效果,我正在考虑将类名存储在数据库中,并在需要时调用该类的方法。像这样,
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
有更好的方法吗?这种方法是否正确?
答案 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"