4

sinatra+datamapperを使用して小さなWebアプリを構築しています。このアプリは、table1に多数のレコードが含まれ、table2には何も含まれていないsqliteデータベースに基づいています。

私のdir構造は次のとおりです。

total 32
-rw-r--r--   1 atma  staff  1895 31 Δεκ 21:35 application.rb
drwxr-xr-x   6 atma  staff   204 31 Δεκ 21:10 archive/
-rw-r--r--@  1 atma  staff    82 23 Δεκ 23:59 config.ru
drwxr-xr-x  10 atma  staff   340 31 Δεκ 21:38 lib/
drwxr-xr-x   4 atma  staff   136 27 Δεκ 20:01 public/
drwxr-xr-x   6 atma  staff   204 24 Δεκ 00:00 views/
ls -R lib
database.rb       db_scheme.rb      db_status.yaml    fileutils.rb      greek-dict.txt        greekcase.rb      rankmanager.rb    wodb_el_v0.0.1.db

データベースはにありますlib/wodb_el_v0.0.1.db。これらのファイルにはすべてクラスが含まれています。

次のような行を追加してクラスを呼び出し、rankmanager.rbまたはdatabase.rbでテストを実行すると、次のようになります。

Class TestClass
[code goes here]
end
x = TestClass.new
x.test_class_method

私がそうするとき、すべてがうまくいきます。テストを実行するために行を削除すると(オブジェクトを作成してメソッドを実行する場合)require_relativeデータベースを使用する代わりにデータベースが消去されapplication.rbます。データベースは、によってロードされるによって処理されます。db_scheme.rbdatabase.rb

db_scheme.rb要点です。

datamapperがそのように動作する理由はありますか?

ps。データベースを作成するメソッドを手動で実行して、データベースにデータをロードdatabase.rbします。

よろしくお願いいたします。よろしくお願いいたします。

4

1 に答える 1

1

あなたのdb_scheme.rb中に:

version = '0.0.1' # database version
db = 'wodb_el_v' + version + '.db' #db location

DataMapper.setup( :default, "sqlite3:///Users/atma/Dropbox/Programming/Projects/Local/HOWDB/lib/#{db}" )

...

if File.exists?(db)
    DataMapper.auto_upgrade!
else
    DataMapper.auto_migrate! # erases and creates the database. This needs run before any work is done with the database!
end

この行は、ファイルが現在の作業ディレクトリ、つまりプログラムを開始するディレクトリにif File.exists?(db)存在するかどうかを確認します。Thinを起動すると、そのディレクトリはディレクトリではなく親ディレクトリになるためファイルは見つからずに実行され、データが消去されます。libauto_migrate!

データベースファイルへの絶対パスを常に処理するようにする必要があります。

version = '0.0.1' # database version
db = File.expand_path('../wodb_el_v#{version}.db', __FILE__)

DataMapper.setup(:default, "sqlite3:///#{db}" )

if File.exists?(db) #db is now the absolute path
  # as before...
于 2012-12-31T20:55:14.093 に答える