2011-10-09 8 views
11

私は最近、Parse.com's REST APIのRuby APIラッパーであるParseResourceを書きました。APIラッパーのActiveRecordのような関連付けを実装する

は、ここではいくつかの基本的な使い方です:

class Post < ParseResource 
    fields :title, :author, :body 
end 
p = Post.create(:title => "Hello world", :author => "Alan", :body => "ipso lorem") 

プロジェクトはかなり若いです、と私は本当に実装したい機能が団体です。このような何か:

class Author < ParseResource 
    has_many :posts 
    fields :name, :email 
end 
class Post < ParseResource 
    belongs_to :author 
    fields :title, :body 
end 
a = Author.create(:name => "Alan", :email => "[email protected]") 
p = Post.create(:title => "Associated!", :body => "ipso lorem", :author => a) 
p.author.class #=> Author 
p.author.name #=> "Alan" 
a.posts #=> an array of Post objects 

私はパースのREST APIを把握している誰からも似たようなだけでなく、を実施したことのある人からのアドバイス、ポインタ、落とし穴が大好きです。

+0

[nulldb](https://github.com/nulldb/nulldb)について聞いたことがありますか? –

答えて

0

これは、オブジェクトをキーと値のペアのハッシュとして保存することで動作します。だから、基本的にあなたはあなたの想像力を動かすことができるIDとハッシュを持っています。

ActiveRecordのような関連付けを行うには、主キー(Author.idなど)と外部キー(Post.author_idなど)が必要です。 Author.idはシンプルです。ParseオブジェクトのIDにするだけです。次に、投稿内の投稿の著者IDを 'author_id'のキーで保存します。それがデータ面です。

コードには、考慮すべきいくつかのレベルの実装があります。検索のためには、このような方法を作ることを目指している:あまりにも難しいことではありませんし、メタプログラミングを使用してインスタンスのために、多くの方法で行うことができます

class Author 
    def posts 
    @posts ||= Post.find(:all, :id => id) 
    end 
end 

class Post 
    def author 
    @author ||= Author.find(author_id) 
    end 
end 

。ハーダーはセーブです。私はそれはあなたがは、シナリオに応じてのためにを目指すかもしれないものだと言うべきで

class Author 
    def after_save 
    super 
    posts.each do |p| 
     p.author_id = id 
     p.save 
    end 
    end 
end 

かという:あなたが目指しているものを、著者側から、少なくとも、このようなものです。アソシエーションを実装する際の落とし穴の1つは、いつ行うべきかを決めることです。あなたの人生を複雑にしたくないのですが、APIコールで夢中になりたくはありません。単純に作者の名前を更新し考えてみましょう:

a = Author.find(1) 
a.name = "Joe" 
a.save 

(このケースで行われる必要がない)各ポストにAUTHOR_ID設定既存の投稿を(それが@postsを設定postsを経由)、ロードされますafter_saveを書かれているように、何も変更されていないのに投稿を保存してください。さらに、保存中に投稿が失敗した場合はどうなりますか?その場合、トランザクション全体がロールバックされ、矛盾した状態が発生しないようにトランザクションが必要です。

ActiveRecord codeには、親が保存されたときに子を処理する方法の問題を取り巻く論理があります。その結果は滑らかで透明な協会ですが、他のすべてのものが関与します。 proxies,association classesなど

私のアドバイスはこれです。本当に滑らかで透明な関連が必要かどうかを決めてください。そうでなければ、いくつかのアクセサと便利なメソッドをメタプログラムし、それをそのままにしておきます。それ以外の場合は、ActiveRecordアソシエーションコードを直接学習するか、DataMapper(AFAIK)を使用して、アソシエーションを含むActiveRecordのようなインターフェイスをデータストアを変更することができます。

3

DataMapper(http://datamapper.org)を使用すると、ほぼすべてのデータストアで作業するのが簡単です。データストアと通信するアダプタを作成し、DataMapperのすべての機能をSQLのように直接使用することができます。ここでは、これらのアダプタの1つを書くことについて少し説明するリンクがあります。 http://www.killswitchcollective.com/articles/55_datamapperabstractadapter_101

関連する問題