DataMapper
今回のリリースで以下のような機能がサポートされます。
- トランザクション
- OR条件
1 Post.all(:id => [1,2,3])
のような事が出来るようになりました。 - NOT条件
1 Post.all(:updated_at
.not => nil) 2 Post.all(:id.not => 3) などが出来るようになりました。
DataMapper
デモサイトであるWatchMe!もアップデートしています。
まだ実用的なサービスになってないですが、登録したサイトをクローリングして全てのページの監視を行い、エラーが発生したらメールで知らせるサービスになる予定です。
posted by
genki
on Fri 17 Apr 2009
at 04:37
with
8 comments
はじめまして。dm-datastore-adapter-0.2.4のtransactionに関して質問させてください。下記クラスメソッドにモデルオブジェクトを更新するブロックを渡して実行させた際、NoMethodError: undefined method primitive_for for DataMapper::Adapters::DataStoreAdapter::Transaction:0x707730b7となりました。datastore-adapter.rbのds_service_getメソッドでcurrent_transactionを取得した後、呼び出そうとしています。下記の記述に誤り等ありますでしょうか?
class GaeTransaction def self.transaction begin txn = DataMapper.repository(:datastore).adapter.transaction_primitive txn.begin DataMapper.repository(:datastore).adapter.push_transaction(txn) yield DataMapper.repository(:datastore).adapter.pop_transaction txn.commit rescue pp $@ p $! txn.rollback ensure txn.close end end end
以下のような使い方でも同じような問題が発生しますでしょうか?
以下のように、defaultのAdapterがセットされていない、とおこられます。 ちなみに、DataMapper.setup(:datastore, :adapter => :datastore, :database => 'gae_sample')を設定しています。また、Rails + DataMapper です。
Adapter not set: default. Did you forget to setup? --gems/dm-core-0.9.11/lib/dm-core/repository.rb:28:in
adapter' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:50:in
link' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:ineach' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:in
link' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:52:inlink' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:in
each' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:inlink' --gems/dm-core-0.9.11/lib/dm-core/transaction.rb:20:in
initialize' --gems/dm-core-0.9.11/lib/dm-core/model.rb:510:intransaction' --gae-sample-3/app/controllers/products_controller.rb:63:in
update'DataStoreAdapter以外のアダプターを使った場合は正常に動作しますか?
Rails + DataMapper + sqlite3で試してみましたが、トランザクションは正常に動作しました。
ちなみに、DataMapper.setup(:datastore,・・・と設定した場合に、モデルクラスのrepositoriesが以下のようになっているのは、正しい姿なのでしょうか? 「@name=:default」があるために「Adapter not set: default」となるのかと。
DataMapper::Repository:0x591431e8 @identity_maps={}, @name=:datastore DataMapper::Repository:0x32f9286d @identity_maps={}, @name=:default DataMapper::Repository:0x3cd2640 @identity_maps={}, @name=:datastore
お手数おかけして申し訳ありません。よろしくお願いします。
:datastoreの指定をせずに、デフォルトとして使ってみるとどうでしょうか?
ご指摘の通り、デフォルト指定で正常に動作しました。ありがとうございます。 しかし、なぜデフォルトでうまくいくのかよく理解できていないので、ソースよく読みます。たびたびお手数おかけして申し訳ございませんでした。
良かったです :-)