GreasemonkeyでActiveRecordチックなもの、にdynamic finder機能を追加してみた
brazil 『Firefoxの場合、__noSuchMethod__ が使えます。
ふと思っていたものをつくってみました - さらさら宇宙忍法帖
http://d.hatena.ne.jp/brazil/20070629/1182994718』 (2007/08/29 01:48)
ということで教えていただいた __noSuchMethod__ をつかってdynamic finder機能を追加してみました。
できたスクリプトは↓これ
gr.user.js
こんな↓感じで使えるように。
// テーブル定義 var Person = GR.newTable("person", "name", "country", "desc"); // 初期レコード登録 [new Person({ name:"Gordon Timothy Nathanson", country:"Japan", desc:"basketball"}), new Person({ name:"Hiromi Go", country:"Japan", desc:"song"}), new Person({ name:"Timothy William Bray", country:"Canada", desc:"xml atom"})].forEach(function(p){ p.save(); }); // timothy な人たちを検索 log("--- tims ---"); var tims = Person.find_all_by_name(/timothy/i); tims.each(function(tim){ log(tim.name); // Gordon Timothy Nathanson, Timothy William Bray }); // go で Japan な人たちを検索 log("--- go japanese ---"); var goJapanese = Person.find_all_by_name_and_country(/Go/, "Japan"); goJapanese.each(function(go){ log(go.name); // Gordon Timothy Nathanson, Hiromi Go }); // Hiromi Bray, US. developerな人を検索、なければ作成 var newer = Person.find_or_create_by_name_and_country_and_desc("Hiromi Bray", "US.", "developer"); newer.save(); // brayな人たちを検索 log("--- brays ---"); var brays = Person.find_all_by_name(/Bray/); brays.each(function(bray){ log(bray.name); // Timothy William Bray, Hiromi Bray });
※ コード中のlog()は Firebugコンソールに出力するために作った関数(unsafeWindow.console.logしてるだけ)
あとはvalidationとかかなぁと思ったけど面倒なのでやめ。
dynamic finderは関係ないけど、昔作ったRSS Readerにキャッシュ機能&既読・未読管理を、と思っていたものに使えるかなぁと考え中。