〜Gauche on Railsへの道〜 2. ActiveRecord 風のものを作る。その4 〜
find(id) メソッドのデバック
やっと、Gauche on Railsのデバックが出来ました ^^)
原因は、クラス変数に相当するスロット(インスタンス変数)も、make (new) しないと作成されない事でした。
Java等と違い、クラス変数相当の :allocation :each-subclass、:allocation :class も基本的にはインスタンス変数なので、スロットを make するまでは作られません。
ということで、ActiveRecord 風のものが動くようになりました。
(define-method find ((klass <active-record-meta>)(id <integer>)) (let* ((query (dbi-prepare (db-conn klass) #`"select * from ,(table-name klass) where id = ?")) (row (first-row (dbi-execute query id)))) (set-ar-columns! (make klass) row))) (define-method db-conn ((klass <active-record-meta>)) (ar-slot-ref klass 'db-conn)) (define-method table-name ((klass <active-record-meta>)) (ar-slot-ref klass 'table-name)) (define-method ar-slot-ref ((klass <active-record-meta>)(name <symbol>)) (if (class-slot-bound? klass 'initialized) (class-slot-ref klass name) (slot-ref (make klass) name))) (define-method first-row ((self <collection>)) (find (lambda(n) #t) self)) (define (set-ar-columns! ar row) (for-each (lambda(v n t) (if v (set! (ref ar (string->symbol n)) (db-result->scheme-object v t)))) row (ref ar 'column-names) (ref ar 'column-types)) ar)