2011-01-11 2 views
4

편집 : 나는 명확하게이 질문을 완전히 다시 작성했습니다. 나는 더 이상 의견이나 대답이 없다.Rails 앱에서 정기적으로 변경되는 데이터베이스 데이터를 처리하는 방법은 무엇입니까?

많은 통계 데이터가있는 2.x Rails 앱을 유지 관리하고 있습니다. 일부 데이터는 실제 데이터이고 일부는 향후 데이터로 추정됩니다. 매년 실제 데이터로 예상 데이터를 업데이트하고 새로운 추정치를 계산해야합니다.

저는 매년 데이터를 앱에로드하기 위해 큰 yml 파일과 마이그레이션을 사용하고 있습니다. 마이 그 레이션은 추정 계산 및 데이터 수정으로 가득차 있습니다. (그것도 작동하는 경우) 몇 시간을 기다리지 않고 재설정 :


문제

내 마이그레이션 없음 스키마 관련 자료들로 가득하고 난 DB를하고 꿈을 꿀 수 없습니다 마이그레이션 할 수 있습니다. 나는 마이 그 레이션이 훌륭하고 깨끗한 것을보고 싶다. 스키마 관련 수정 만하면된다. 그러나 마이그레이션을 사용하지 않는다면 매년 데이터를 업데이트해야합니다.


은 도움말

나는 여러분의 의견과 답변을 듣고 싶습니다이 필요했습니다. 나는 사람들이 비슷한 상황을 어떻게 다루고 있는지에 대한 모범 사례와 아이디어와 같이은 탄환을 찾는 것이 아닙니다.

+0

흠, 어쩌면이 질문을 수정해야합니다. 꽤 지저분 해. 심지어 나는 이것에 대답하고 싶지 않다. 글쎄 나는 이것 때문에 Tumbleweed 배지를 가지고있다. – hade

+0

나는이 질문을 명확하게 재 작성했다. 모든 댓글과 답변을 높이 평가합니다! – hade

+0

+50 현상금이 추가되었습니다. – hade

답변

1

일 년에 한 번 큰 작업 (yml 파일을 사용하는 데이터로드)이 있지만 한 달에 한 번 작은 작업이있는 것 같습니다.

통계 데이터를 사용한 경험을 통해 더 많은 데이터를 정리하고 추가하기 위해 더 많은 작업을 수행하게 될 것입니다.

resqueresque scheduler과 같은 작업 처리 프레임 워크를 사용합니다.

작업을 월, 일, 일 또는 한 달에 한 번 실행하거나 일정하게 실행되도록 예약 할 수 있습니다. 작업은 yml 파일 (또는 yml 파일 세트)로드 또는 데이터 정리와 같은 것입니다. 한 클래스를 사용할 수 있도록 작업에 보낼 매개 변수를 제어 할 수 있지만 작업을 대기열에 넣거나 스케쥴하는 방식에 따라 데이터를 업데이트하거나 정리하는 방법을 교대로 사용할 수 있습니다.

+0

감사합니다! 나는 진짜로 resque의 아이디어를 좋아했다. 나는 그것을 조사 할 것이다. – hade

1

우선, 이것은 매우 흥미로운 질문입니다. 내가 아는 한, 마이그레이션에서 데이터를로드하는 것은 좋지 않습니다. 일반적으로 DB에서 데이터 로딩을 위해 db/seeds.rb를 사용해야하며 lib 디렉토리에 넣고 db/seeds.rb에서 호출하는 작은 클래스 도우미를 작성하는 것이 좋습니다. , 분명히

lib/data_loader.rb 
lib/years/2009.rb 
lib/years/2010.rb 

을 당신은 당신의 마이그레이션을 취소하고 원하는해야하는 방식으로 lib 디렉토리/data_loader.rb에 대한 코드를 작성해야하지만, 난 단지 일반을 제공하기 위해 노력했다 : 나는 이미지는 다음과 같은 방법으로 당신에게 파일을 구성 할 수 내가 그런 문제에 직면해야한다면 어떻게하면 코드를 정리할 수 있을지에 대한 아이디어.

나는 당신의 질문에 도움이되는 방식으로 대답했지만 확실하지는 않습니다.

+0

포스트에 감사드립니다! 씨앗은 주로 초기 데이터를 DB에 입력하는 데 사용된다는 것을 알고 있습니다. 나는 seeds.rb가 매년 데이터를 업데이트하는 데 어떻게 사용될 수 있는지 이해하지 못했습니다. 이 접근법으로 rake db : seed를 어떻게 호출해야합니까? DB 내용을 업데이트해야합니까? – hade

+0

"year thing"을 처리 할 수있는 방식으로 "data_loader"를 작성할 수 있습니다. 나는 "data_loader.load_current_year"와 같은 것을 생각하고 있었지만, 다른 응답을 읽는다면 그 중 하나와 함께 가야한다고 생각합니다. 태스크를 사용하는 것이 더 훌륭한 솔루션 일 수도 있습니다. 일년이 걸릴 태스크를 매개 변수로 작성해야합니다. – lucapette

+0

감사합니다. [DHH에 따르면] (http://twitter.com/dhh/statuses/27425849821110272) 씨앗은 처음으로 데이터베이스를 설정하는 데 사용해야합니다. 문제는 실제로 처음부터 시작할 가능성을 원한다면 seeds.rb를 최신 상태로 유지하는 것입니다. 모든 시간을 계속 변경하는 초기 데이터 종류 : – hade

1

내가 너라면 나는 사용자 지정 레이크 작업을 만들 것입니다. 당신은 모든 당신이 모델과 액티브 연결에 액세스 할 수 있습니다 그리고 일년에 한 번 당신이 일을 끝낼 것입니다 :

rake calculate 
+0

해답을 가져 주셔서 감사합니다! 몇 가지 질문. 데이터에 관해서, 레이크 작업으로 새 데이터를로드하는 방법은 무엇입니까? yml 파일을 사용 하시겠습니까? 나는 매년 큰 작업 외에 매년 데이터에 대한 조정 (주로 수정)을 매달 한 번씩하는 것을 잊어 버렸습니다. 레이크 작업으로 수십 개의 레이크 작업이 끝납니다. 그리고 실행 순서를 추적해야합니다. – hade

0

내가 인터넷에서 자주 변경 CSV 파일의 데이터 및 업데이트 데이터를로드해야하는 상황이 매일. 전 과정을 수행하는 방법에 대한 다소 완전한 예를 포함 할 것입니다.


먼저 나는 lib/tasks/update.rake에 레이크 파일이 :

require 'update/from_csv_files.rb' 

namespace :update do 

    task :csvfiles => :environment do 
    Dir.glob('db/static_data/*.csv') do |file| 
     Update::FromCsvFiles.load(file) 
    end 
    end 

end 

=> :environment 우리가 보통 모델을 통해 데이터베이스에 액세스 할 수 있습니다 의미합니다.내 CSV 파일 변경이 새로운 데이터를로드 할 때마다

require 'csv' 

module Update 
    module FromCsvFiles 

    def FromCsvFiles.load(file) 
     csv = CSV.open(file, 'r') 
     csv.each do |row| 
     id = row[0] 

     s = Statistic.find_by_id(id) 
     if (s.nil?) 
      s = Statistic.new 
      s.id= id 
     end 

     s.survey_area = row[1] 
     s.nr_of_space_men = row[2] 
     s.save 
     end 
    end 

    end 
end 

그럼 난 그냥 rake update:csvfiles을 실행할 수 있습니다

는 다음 나는 lib/update/from_csv_files.rb 파일의 코드는 실제 작업을 수행해야합니다. 또한 일일 데이터를 업데이트하는 것과 비슷한 방식으로 설정되는 또 다른 작업이 있습니다.


귀하의 경우에는 YML 파일을로드하거나 계산을 직접 수행 할 수있는 코드를 작성해야합니다. 작은 수정을 처리하기 위해 YML 파일을로드하고 레이크 작업에서 특정 파일을 호출하는 일반적인 방법을 만들 수 있습니다. 그렇게하면 YML 파일을 포함시키고 Rake 파일을 새로운 작업으로 업데이트하면됩니다. 실행 순서를 처리하기 위해 다른 레이크 작업을 적절한 순서로 호출하는 레이크 작업을 만들 수 있습니다. 나는 이제 몇 가지 아이디어를 던지고 있습니다. 당신은 저보다 잘 압니다.

+0

답장을 위해 @Gieron에게 감사드립니다. 이것은 CSV 입력을 다루는 편리한 방법입니다. 좋은! – hade

관련 문제