gotin blog

Whatever gotin wanna write

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にキャッシュ機能&既読・未読管理を、と思っていたものに使えるかなぁと考え中。