2012-08-29 2 views
0

레일즈 애플리케이션에 각각 사용자 정의 구현이있는 여러 제공자가 있습니다.Ruby on Rails : 구현이 다른 모델

제공자는 모두 DB에 저장되며, 데이터에 따라 DB에서 객체를로드 할 때 선택해야 할 구현이 결정되어야합니다.

여기에 나와있는 해결책이 있습니다.

/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 여기 /lib/second_provider.rb

module SecondProvider 
    def foo 
    puts "bar" 
    end 
end 

그리고

module FirstProvider 
    def foo 
    puts "foo" 
    end 
end 

은 어떻게 그것을 사용하십시오 :

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

이 솔루션을 사용하는 데 문제가 있습니까? 이 일을 더 적절하게 생각할 수 있습니까?

답변

1

나는 레일 'Single Inheritance Table 메커니즘에 대한보고를하는 것이 좋습니다 것입니다.

당신은 여전히 ​​(X은 당신이 그들의 foo 구현이 공급자의 수입니다) 만들 수 X 클래스를 가질 것이다. 이러한 클래스는 모두 Provider ActiveRecord 클래스에서 상속됩니다.

그러나 load_implementation과 같은 메서드를 작성할 필요는 없습니다. 제공자 유형은 데이터베이스 테이블 "유형"의 데이터베이스 테이블 "제공자"의 데이터베이스 열에 저장됩니다.

+0

그게 내가 찾고 있던거야. 구현 파일은'app/models /'에 있어야 하는가? – nbarraille

+0

예 그들은 거기에 위치해야합니다! –

0

ActiveRecord 단일 테이블 상속을 사용하지 않으려는 이유가 있습니까?

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