2016-10-21 4 views
0

私はRails以外のアプリケーションを作成し、DataMapperをORMとして使用しています。DataMapperエンティティは永続化目的でのみ使用する必要がありますか?

SQLテーブルにマップされるエンティティでは、DataMapper :: Resourceを含むクラスを宣言します。

質問があります。これらのクラスのインスタンスを単純なオブジェクト(メソッドへの渡し、値の操作など)として使用することはできますか?または、データを永続化するためにのみ使用する必要があります(リポジトリクラスなど)。

私はRubyの世界では新しく、規約を知らない。 メソッドが作成されているUserエンティティがある場合、情報を格納する別のクラスUser(状態フィールドとメソッドはありません)を作成することをお勧めしますか? JavaのPOJO(プレーンな古いJavaオブジェクト)のアナログ?

+0

です。それらのPOROは何を使用しますか? –

+0

たとえば、ユーザーから取得した情報をそこに格納する。セッションに保存する。その他(異なる種類のデータベース永続化操作) – RhinoLarva

答えて

0

いくつかの利点を持つ単純なオブジェクトリスト用のラッパークラスを作成することができます。コメントの中で言及しているように、データをさまざまな方法で保存したい場合は、別個のクラスを作成するのが便利です。

典型的なDataMapperやActiveRecordの使用については、特にコレクションにメソッドを追加していない場合は、プレーンオブジェクトリスト用のラッパークラスを作成するのは一般的ではないと思います。それが一般的ではない主な理由は、ActiveRecordまたはDataMapperのクエリ結果が配列のようなものであることです。さらに、モデルインスタンスをハッシュに変換することで、実際に追加された機能は得られません。私はいくつかの例を示しましょう:

# collections are array-like 
User.all.map(&:name) == User.all.to_a.map(&:name) 

# converting a record to a hash doesn't add much 
user = User.first 
user_hash = user.attributes 
user.name == user_hash[:name] 

言われて、そこに1つの警告があり、そしてそれがORMでチェーン可能な方法で行う必要があること:

# this is valid chaining 
User.all.where(name: "max") 

# this raises a NoMethodError for 'where' 
User.all.to_a.where(name: "max") 

whereはORM方法、ではない配列であります方法。したがって、クエリ結果を配列に変換すると、その配列にはアクセスできませんでした。このため、配列とクエリーコレクションを区別することは便利です。

しかし、実際に空のラッパークラスを作成するとどれくらいのメリットがありますか?

class RecordsInMemory 
    def initialize(query_collection) 
    @list = query_collection.map(&:attributes) 
    end 
end 
records_in_memory = RecordsInMemory.new(User.all) 
records_in_memory.list.map(&:name) 

# versus ... 

records_in_memory = User.all.map(&:attributes) 
records_in_memory.map(&:name) 

長期的には、プレーンオブジェクトリストにメソッドを追加すると思うなら、それをクラスにする必要があります。しかし、そうでなければ、明確な名前の変数を使用すれば十分だと思います。

関連する問題