Weitere ähnliche Inhalte
Ähnlich wie SimpleResource (20)
Kürzlich hochgeladen (11)
SimpleResource
- 11. (個人的には)ダメな例その2 : SQLJOIN SELECT COUNT(*) FROM comment_pics LEFT JOIN comments ON comment_pics.comment_id = comments.id LEFT JOIN entries ON comment.entry_id = entries.id WHERE entries.id = entry_id -> クエリが遅い。 entries、comments、comment_pics各テーブルが すべて同一DB上にあることが前提。 スケールがめんどくさそう。
- 24. 使用例 –blogアプリ has_many has_many { “id” => 12763, “body” => “Hello, world!”, “comments” => [ {“id”=>735634, “body” => “comment1”, “pics” => [“pic1.jpg”]}, {“id” => 735635, “body” => “comment2”} ] } スキーマレス化
- 25. class Entry < SimpleResource::Base include SimpleResource::MysqlEntityBackend end entry = Entry.create("subject" => "test", "body" => "hello world!", "author" => "kazuki") entry.id #=> 54 (create時にidを指定しなかった場合は、自動採番される)
- 26. Entryへのコメントの追加 comment = {"body" => "nice1!", "from" => "kazuko", "pics" => ["pic1.jpg", "pic2.jpg"]} entry = Entry.find(12763) entry.comments ||= [] entry.comments << comment entry.save ダメな例
- 27. プロセス1 プロセス2 entry = Entry.find(12763) entry.comments ||= [] entry.comments << “foo” entry.save ① ② entry = Entry.find(12763) entry.comments ||= [] entry.comments << “bar” entry.save ③ ④ プロセス1の書き込みが 破壊される
- 28. Entryへのコメントの追加 comment = {"body" => "nice1!", "from" => "kazuko", "pics" => ["pic1.jpg", "pic2.jpg"]} Entry.find_with_lock(12763) do |entry| entry.comments ||= [] entry.comments << comment entry.save end
- 29. プロセス1 プロセス2 Entry.find_with_lock(12763) do |entry| entry.comments ||= [] entry.comments << comment entry.save end Entry.find_with_lock(12763) do |entry| entry.comments ||= [] entry.comments << comment entry.save end