2012-08-08 3 views
0

내 Sinatra 앱을위한 "조명기"기능을 구축하려고합니다. 데이터베이스 이름으로 csv의 데이터베이스를 내보내고 참조로 파일 이름을 사용하여 datamapper를 통해 클래스에 액세스합니다.Ruby에서 동적으로 생성 된 DataMapper 모델에 데이터를 삽입하는 방법은 무엇입니까?

".destroy!" 일하고있다. "잘못된 숫자의 인수 (1에 대해 0)"오류가 계속 발생하면서 ".create"메서드를 통해 새 데이터를 삽입 할 수 없습니다.

데이터를 수동으로 삽입하려고했으나 행 대신 실제로 테스트 해시를 작성했지만 오류가 지속됩니다.

문제는 아니지만 번들 환경 (번들 exec rake db : fixtures)에서 레이크를 통해 코드를 실행하고 있습니다.

require 'data_mapper' 
require 'config/database' 

Dir["./models/fixtures/*.csv"].each do |file| 
    class_name = DataMapper::Inflector.singularize(
    File.basename(file, '.csv').capitalize 
) 
    current_model = Object.const_get(class_name) 
    current_model.destroy! 

    # Next 4 lines are turning the file CSV into a Hash of arrays, 
    # so it can be used to perform the insert on the database. 
    csv_data = CSV.read(file) 
    headers = csv_data.shift.map {|i| i.to_sym } 
    string_data = csv_data.map {|row| row.map {|cell| cell.to_s } } 
    array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] } 

    current_model.transaction do 
    array_of_hashes.each do |row| 
     current_model.create(row) 
    end 
    end 
end 

이것은 실행의 --trace 출력 :

** Invoke db:fixtures (first_time) 
** Execute db:fixtures 
~ default: begin 
~ default: rollback 
rake aborted! 
wrong number of arguments (1 for 0) 
/Users/username/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/thread.rb:144:in initialize' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-validations-1.2.0/lib/dm-validations.rb:129:innew' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-validations-1.2.0/lib/dm-validations.rb:129:in create' 
/Volumes/StaticData/fixtures/Rakefile:27:inblock (5 levels) in ' 
/Volumes/StaticData/fixtures/Rakefile:26:in each' 
/Volumes/StaticData/fixtures/Rakefile:26:inblock (4 levels) in ' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-transactions-1.2.0/lib/dm-transactions.rb:373:in block in transaction' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-transactions-1.2.0/lib/dm-transactions.rb:131:inblock in commit' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-transactions-1.2.0/lib/dm-transactions.rb:195:in within' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-transactions-1.2.0/lib/dm-transactions.rb:131:incommit' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/dm-transactions-1.2.0/lib/dm-transactions.rb:373:in transaction' 
/Volumes/StaticData/fixtures/Rakefile:25:inblock (3 levels) in ' 
/Volumes/StaticData/fixtures/Rakefile:14:in each' 
/Volumes/StaticData/fixtures/Rakefile:14:inblock (2 levels) in ' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:205:in call' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:205:inblock in execute' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:200:in each' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:200:inexecute' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:158:in block in invoke_with_call_chain' 
/Users/username/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:inmon_synchronize' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:151:in invoke_with_call_chain' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:144:ininvoke' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:116:in invoke_task' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:inblock (2 levels) in top_level' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:in each' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:inblock in top_level' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:133:in standard_exception_handling' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:88:intop_level' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:66:in block in run' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:133:instandard_exception_handling' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:63:in run' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/gems/rake-0.9.2.2/bin/rake:33:in' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/bin/rake:23:in load' 
/Volumes/StaticData/fixtures/vendor/bundler/ruby/1.9.1/bin/rake:23:in' 
Tasks: TOP => db:fixtures 

감사합니다!

답변

1

발견. 내 모델 중 하나는 "대기열"이라고 불렀고 thread.rb의 Queue 객체와 충돌했습니다. 내 모델의 이름이 바뀌었고 지금은 모두 괜찮습니다.

관련 문제