2014-07-20 3 views
1

여러 테이블이있는 데이터베이스가 있어야합니다. 모든 테이블의 구조는 같습니다. Ruby/Sinatra에서이 데이터베이스로 작업 할 작은 웹 응용 프로그램을 작성 중입니다. ORM - Active Record 또는 DataMapper (선호)를 사용하여 테이블 작업을 단순화하고 싶습니다. 이 CopyPaste에없이 수십 테이블에 대해 수행 할 수있는 방법ORM 한 모델 - 테이블 곱하기

class Table 
    include DataMapper::Resource 
    property id, Serial 
    property item, String 
end 

class TableA < Table 
    self.table_name = 'table_a' 
end 

class TableB < Table 
    self.table_name = 'table_b' 
end 

: 여러 테이블에 대한 단일 모델의 사용에 대한 매뉴얼 같은 것을 제공?

가능한 경우 코드/설정을 변경하지 않고 표를 추가/제거하고 응용 프로그램을 다시 시작해야합니다. 같은

뭔가 :이 평가를 사용하고 실현하려 방식의

# Model declaration 

DataMapper.finalize 

itemA = Table.new (use_table: 'table_a') 
itemB = Table.new (use_table: 'table_b') 
+0

http://stackoverflow.com/questions/5981724/multiple-database-tables-within-one-ar-model-in-rails-3 – Reisenfag

답변

0

하나.

class Table 
    include DataMapper::Resource 
    property id, Serial 
    property item, String 
end 

table_names = {'TableA' => 'table_a', 'TableB' => 'table_b'} 

table_names.each do |klass_name, table_name| 
eval <<DYNAMIC 
    class #{klass_name} < Table 
    self.table_name = '#{table_name}' 
    end 
DYNAMIC 
end 
+0

솔루션은 가능하지만, 필요 꽤 무엇으로 . 질문을 보충했다. – Reisenfag

+0

공장 패턴을 사용하려는 것 같습니다. 'table_name'을 받아들이고'Table'의 서브 클래스를 리턴하는 메소드를'Table'에 추가 할 수 있습니다. 이름으로 인덱스 화 된'Table'에 모든 서브 클래스의 캐시를 추가함으로써이 메소드를 구현할 수 있습니다. 조회에서 현재 이름을 찾지 못하면 새 서브 클래스를 생성하여이를 색인에 추가합니다. – Nishu

+0

액티브 레코드에 해결책이 있습니다. '클래스 테스트 <액티브 :: Base' ' 'Test.table_name = "tests_a"' 는'itema = Test.new'이 'itema.item는 "AAA"는'=을 end' : 이것은 그냥 작동 코드 'itema.save' 은'Test.table_name은 = "tests_b는"'' 는 itemb = Test.new' itemb.item '는'BBB '' '을 itemb.save'가 = – Reisenfag