2011-01-07 3 views
1

원시 데이터를 가져와야하는 많은 레거시 데이터베이스가 있습니다. 데이터베이스의 각 테이블에는 임의의 이름과 임의의 필드 콜렉션이 있습니다. 나는 다음과 같은 클래스와이 분야에 대한 액세스를 받고있다을 : 나는 테이블의 이름을 알고 내 코드에있는 지점에 도달 할 때레거시 테이블에서 ActiveRecord 클래스 사용

class Frt < ActiveRecord::Base 
    establish_connection :legacy 
    set_primary_key "point" 
end 

, 내가 호출 할 수

Frt.set_table_name "table" 
t = Frt.find_by_sql("blah") 
something = t.field_name + t.other_field_name 
etc... 

문제가 있다는 것입니다 나는 이것이 내가 먼저 선택한 테이블에 접근 가능한 필드 이름을 잠그는 것을 깨달았다. `set_table_name '메소드에 대한 다른 호출로 테이블을 변경하려고하면 클래스의 속성이 변경되지만 새로운 인스턴스는 여전히 첫 번째 인스턴스와 동일한 필드 세트를 갖습니다. 지금까지, 내 ​​애플 리케이션에서, 나는 다른 것을 필요로하지 않았지만, 내가 길 아래로 엉덩이에 나를 물 것입니다 방법으로 프로그램을 확장거야.

ActiveRecord가 마법을 다시 수행하기를 기대하면서`Frt.send : set_table_name "new_table"을 시도했습니다. 그렇지 않습니다.

누구나 ActiveRecord의 편리 성을 유지하는 방법을 제안 할 수 있지만로드해야하는 테이블의 필드를 동적으로 다시 매핑 할 수 있습니까?

+0

나머지 코드는 게시 할 수 있습니까? 어디서 ActiveRecord obj를 만드나요? – sethvargo

+0

위의 내용이 아닌가요? 't = Frt.find_by_sql ("blah")' –

답변

1

내 자신의 게시물에 답변 해 드려 죄송 합니다만, 제가 잘 설명하지 못했을 것 같습니다. 이 후 다른 누군가가 따라 오는 경우, "Frt.reset_column_information"메소드를 호출해야했습니다. 이 문제를 다시 조사하고 ActiveRecord 클래스의 모든 메서드를 덤프하고 목록에 숨어있는 것을 발견했습니다.

0

이 문제를 해결하는 더 좋은 방법은 상호 작용할 필요가있는 각 레거시 테이블에 대한 모델을 만드는 것입니다. 동적 테이블 이름 다시 매핑이 필요하지 않으며 즉시 사용할 수 있습니다.

+0

자문을 구했지만 필드는 다양한 요소에 따라 여전히 테이블 유형에 따라 변경됩니다. –

1

나는 그것을 사용한 적이 없지만 Magic Model Generator은 자동으로 테이블 용 모델을 생성한다고 주장합니다.

관련 문제