문제

외부 라이브러리에서 객체를 얻고 있으며 해당 객체를 데이터베이스에 저장해야합니다. 객체에서 시작하여 테이블과 관계를 만들 수있는 방법이 있습니까?

감사! 로베르토

도움이 되었습니까?

해결책

당신이 그런 식으로 테이블을 동적으로 만들 수 있더라도 (당신이 할 수 있다고 말하지는 않습니다). 나는 그렇게하고 싶지 않을 것입니다. 오류가 너무 많습니다.

나는 손으로 마이그레이션을 만들고 테이블과 필드를 사전 만들어 내고 필요에 따라 줄로 채 웁니다.

다른 팁

참고 : 이것은 끔찍한 해킹이며 앞으로 몇 년 동안 버그를 다듬을 것입니다. 그러나 그것은 매우 쉽습니다.

이것은 Rails ActiveSupport에 의존하며 ActiveRecord는 이미로드 중입니다.

2 개의 인스턴스 변수가있는 타사 라이브러리에서 임의의 객체를 얻을 수 있다고 가정 해 봅시다. 클래스는 다음과 같이 보일 수 있습니다.

class Animal
    attr_accessor :name, :number_of_legs
end
a = SomeThirdPartyLibrary.get_animal

반사를 사용하여 이름과 열을 알아낼 수 있습니다.

table_name = a.class.to_s.tableize
column_names = a.instance_variables.map{ |n| n[1..-1] } # remove the @
column_types = a.instance_variables.map{ |n| a.instance_variable_get(n).class 
    }.map{ |c| sql_type_for_class(c) } # go write sql_type_for_class please

그런 다음 ActiveRecord 마이그레이션을 사용하여 다음과 같은 테이블을 만들 수 있습니다.

ActiveRecord::Migration.class_eval do
  create_table table_name do |t|
    column_names.zip(column_types).each do |colname, coltype|
      t.column colname, coltype
    end
  end
end

그런 다음 마지막으로 ActiveRecord 클래스를 선언 한 다음 방금 만들어진 테이블과 인터페이스 할 수 있습니다.

# Note we declare a module so the new classes don't conflict with the existing ones
module GeneratedClasses; end
eval "class GeneratedClasses::#{a.class} < ActiveRecord::Base; end"

프레스토 악장!

이제 이것을 할 수 있습니다 :

a = GeneratedClasses::Animal.new
a.update_attributes whatever
a.save

추신 : 이렇게하지 마세요!

끔찍한 것 외에도 Rails 앱이 다시 시작되면 생성 된 클래스의 모든 개념을 잃게되므로이를 지속하는 메커니즘도 고안해야합니다.

이 정확한 상황이 있습니다. 응용 프로그램 외부의 데이터를 읽어야하고 성능 히트가 너무 커서 로컬에서 저장합니다. 시간이 지남에 따라 데이터와 함께 작동하는 스키마와 마이그레이션을 손으로 개발 한 솔루션을 사용하여 데이터를 테이블로 유지할 수 있습니다. 데이터에 효과가있는 캐싱 체계를 개발했으며 성능이 크게 증가했습니다.

말할 것도, 나는 모든 것을 손으로했다. 그리고 나는 그것을 후회하지 않는다. 내 데이터베이스가 안정적이고 DB 테이블을 즉석에서 다시 만들지 않았다는 확신을 가질 수 있습니다. 그 때문에 응용 프로그램의 안정성에 대해 걱정하지 않습니다.

객체와 함께하려는 일에 따라 객체를 데이터베이스에 직접 저장할 수 있습니다. 직렬화 그들을.

ORM 솔루션을 살펴보십시오. 또는 XML로 보관하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top