2012-08-29 119 views
0

我在我的Rails应用程序中有一堆不同的提供者,每个提供者都有自定义的实现。Ruby on Rails:不同实现的模型

提供者都存储在数据库中,当从数据库加载对象时,应根据数据加载对象的实现。

这是我想出来的解决方案。

/app/models/provider.rb

class Provider < ActiveRecord::Base 
    attr_accessible :name 

    validates :name, :presence => true 

    after_find :load_implementation 

    # Loads the correct implementation for the provider 
    def load_implementation 
    case self.name 
    when "FirstProvider" 
     extend FirstProvider 
    when "SecondProvider" 
     extend SecondProvider 
    else 
     raise "No implementation for provider #{self.name}" 
    end 
    end 
end 

/lib/first_provider.rb

module FirstProvider 
    def foo 
    puts "foo" 
    end 
end 

/lib/second_provider.rb

module SecondProvider 
    def foo 
    puts "bar" 
    end 
end 

这里是我如何使用它:

Providers.all.each do |p| 
    p.foo 
end 

您是否看到使用此解决方案的任何问题?你能想出一个更合适的方式来做到这一点吗?

回答

1

我建议看看Rails的Single Inheritance Table机制。

你还是会有X类来创建(其中X是你必须与他们的foo执行提供商的号码)。这些类将全部继承自主要的Provider ActiveRecord类。

但是,您不必编写一个方法,如load_implementation。提供者的类型将被存储在数据库表“提供者”的数据库列“类型”中。

+0

这就是我正在寻找的。实施文件是否应该位于'app/models /'中? – nbarraille

+0

是的,他们应该位于那里! –

0

有什么原因你不想使用ActiveRecord单表继承?

class FirstProvider < Provider 
    def foo 
    puts 'foo' 
    end 
end