ActiveRecord를 사용하여 객체에서 테이블까지
-
03-07-2019 - |
문제
외부 라이브러리에서 객체를 얻고 있으며 해당 객체를 데이터베이스에 저장해야합니다. 객체에서 시작하여 테이블과 관계를 만들 수있는 방법이 있습니까?
감사! 로베르토
해결책
당신이 그런 식으로 테이블을 동적으로 만들 수 있더라도 (당신이 할 수 있다고 말하지는 않습니다). 나는 그렇게하고 싶지 않을 것입니다. 오류가 너무 많습니다.
나는 손으로 마이그레이션을 만들고 테이블과 필드를 사전 만들어 내고 필요에 따라 줄로 채 웁니다.
다른 팁
참고 : 이것은 끔찍한 해킹이며 앞으로 몇 년 동안 버그를 다듬을 것입니다. 그러나 그것은 매우 쉽습니다.
이것은 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로 보관하십시오.