プロトタイプ作成な log

とりあえず、rails でプロトタイプ作ってみて、Django でも同じソレを作ってみる事で評価してみる事に。ただし、別途 SD なサンプルをリバースしてみて評価はする予定。
色んな意味でヘコんでばかりもいられませんので。(何
で、とりあえず以下の手順でざっくり作ってみる

  1. スキーマ検討
  2. rails プロジェクト作成
  3. migrate
  4. scaffold を generate (スペジェネってまだあるのかな??)

ココまでヤッて同じソレを Django でナニしてみますか。
# rails 方面についてはリハビリ必要

rails プロジェクト作成

業務向けなんですがプロトタイプなんで全部サラす。一応開発な環境で作業を。

ってそりゃいいんですが、環境ってどーなってんだよ、と言いつつブログをほじくると、このエントリにて色々ヤッてる模様。gem で install してるんだったら確か ... と言いつつ

$ ls /usr/lib/ruby/gems/1.8/gems/
BlueCloth-1.0.0     actionpack-1.12.5       activesupport-1.2.5     rails-1.0.0
RedCloth-3.0.4      actionwebservice-1.0.0  activesupport-1.3.1     rails-1.1.6
actionmailer-1.1.5  actionwebservice-1.1.6  acts_as_taggable-2.0.2  rake-0.7.1
actionmailer-1.2.5  activerecord-1.13.2     builder-2.0.0           sources-0.0.1
actionpack-1.11.2   activerecord-1.14.4     feedtools-0.2.26        uuidtools-1.0.0
$

とりあえずプロトタイプなんで、と言い訳しつつ 1.1.6 を使う事に決定。とりあえず手探り状態ですが、ヤッてみます。

$ rails proto
(出力は略)
$

一応、ココ式で symlink を張っておく事に。

$ cd proto
$ cd vendor
$ ls
plugins
$ mkdir rails
$ cd rails
$ ln -s /usr/lib/ruby/gems/1.8/gems/actionmailer-1.2.5 actionmailer
$ ln -s /usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5 actionpack
$ ln -s /usr/lib/ruby/gems/1.8/gems/actionwebservice-1.1.6 actionwebservice
$ ln -s /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4 activerecord
$ ln -s /usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1 activesupport
$ ln -s /usr/lib/ruby/gems/1.8/gems/rails-1.1.6 railties
$ ls
actionmailer  actionpack  actionwebservice  activerecord  activesupport  railties
$

とっとと migrate してしまいたいのですが、とりあえず sqlite3 な config/database.yml を作っておきます。その前に開発環境に sqlite3 ガラミなソレ達を install。こいつの debian なバージョンっていくつなんだろうか。(を

# apt-get install sqlite3 -fy 
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libreadline5 libsqlite3-0
Suggested packages:
  sqlite3-doc
The following NEW packages will be installed:
  libreadline5 libsqlite3-0 sqlite3
(以下略)
#

ruby なソレも必要なんだろうな。

# apt-cache search sqlite|grep ruby 
libdbd-sqlite-ruby - Ruby/DBI driver for SQLite
libdbd-sqlite-ruby1.6 - Ruby/DBI SQLite driver for Ruby 1.6
libdbd-sqlite-ruby1.8 - Ruby/DBI SQLite driver for Ruby 1.8
# apt-get install libdbd-sqlite-ruby
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libdbd-sqlite-ruby1.8 libdbi-ruby1.8 libsqlite0
Suggested packages:
  libdbi-ruby
The following NEW packages will be installed:
  libdbd-sqlite-ruby libdbd-sqlite-ruby1.8 libdbi-ruby1.8 libsqlite0
(以下略
#

これでヤッてみます。ええと、以下。(抜粋

development:
  adapter: sqlite3
  database: db/sqlite3

(中略

test:
  adapter: sqlite3
  database: db/sqlite3.db

スペジェネ使いたいんですが、とりあえず真っ当なのをこさえてみる。

$ ./script/generate model Hello
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/hello.rb
      create  test/unit/hello_test.rb
      create  test/fixtures/hellos.yml
      create  db/migrate
      create  db/migrate/001_create_hellos.rb
$

で、とりあえず、db/migrate/001_create_hellos.rb を以下のように。

class CreateHellos < ActiveRecord::Migration
  def self.up
    create_table :hellos do |t|
      # t.column :name, :string
      t.column :name, :string
      t.column :value, :string
    end
  end

  def self.down
    drop_table :hellos
  end
end

で、migrate 実行したら以下。

$ rake db:migrate
(in /home/xxx/proto)
rake aborted!
no such file to load -- sqlite3

(See full trace by running task with --trace)
$

どうもパケジが不足らしい。ここによると libsqlite3-dev と gem で入れる sqlite3-ruby ってナニが必要との事。

# apt-get install -fy libsqlite3-dev
# gem install sqlite3-ruby

微妙に文句を言われた気がしますがスルー。で、再度チャレンジの前に config/database.yml を修正しとく。以下抜粋。

development:
  adapter: sqlite3
  database: db/dev.sqlite3.db

(中略

test:
  adapter: sqlite3
  database: db/test.sqlite3.db

で、リトライ。

$ rake db:migrate
(in /home/xxx/proto)
== CreateHellos: migrating ====================================================
-- create_table(:hellos)
   -> 0.0217s
== CreateHellos: migrated (0.0224s) ===========================================

$

うむ。ナカミも見てみる。

$ sqlite3 db/dev.sqlite3.db
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> .tables
hellos       schema_info
sqlite> .dump hellos
BEGIN TRANSACTION;
CREATE TABLE hellos ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "value" varchar(255));
COMMIT;
sqlite> .exit
$

ええと、とりあえず今作った model はナシとゆー事にしといて、スペジェネを探さねば。

$ rm db/dev.sqlite3.db
$ ./script/destroy model Hello
    notempty  db/migrate
    notempty  db
          rm  db/migrate/001_create_hellos.rb
          rm  test/fixtures/hellos.yml
          rm  test/unit/hello_test.rb
          rm  app/models/hello.rb
       rmdir  test/fixtures
    notempty  test
       rmdir  test/unit
    notempty  test
       rmdir  app/models
    notempty  app
$

migrate

もしかして obsolete だったりなんかするのかなぁ。舞波さんトコの最新記事の日付が 2006-02-04 だったりするな。気にせず入れてみるか。ってその前に model 作るの推奨と出ていますな。

いくつかポインタを列挙

うーん。GetText がなんやら、とあるが、面倒なのでスペシャルで。ここからは、くまくま本のナニを参照しつつ作業。まず検討したナニに沿って model 作成して migrate を作ってテーブル作成。

$ ./script/generate model Model
      create  app/models/
      create  test/unit/
      create  test/fixtures/
      create  app/models/model.rb
      create  test/unit/model_test.rb
      create  test/fixtures/models.yml
      exists  db/migrate
      create  db/migrate/001_create_models.rb
$ ./script/generate model Purchase
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/purchase.rb
      create  test/unit/purchase_test.rb
      create  test/fixtures/purchases.yml
      exists  db/migrate
      create  db/migrate/002_create_purchases.rb
$ ./script/generate model Use
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/use.rb
      create  test/unit/use_test.rb
      create  test/fixtures/uses.yml
      exists  db/migrate
      create  db/migrate/003_create_uses.rb
$ ./script/generate model Vendor
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/vendor.rb
      create  test/unit/vendor_test.rb
      create  test/fixtures/vendors.yml
      exists  db/migrate
      create  db/migrate/004_create_vendors.rb
$ ./script/generate model Maker
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/maker.rb
      create  test/unit/maker_test.rb
      create  test/fixtures/makers.yml
      exists  db/migrate
      create  db/migrate/005_create_makers.rb
$ ./script/generate model Type
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/type.rb
      create  test/unit/type_test.rb
      create  test/fixtures/types.yml
      exists  db/migrate
      create  db/migrate/006_create_types.rb
$

とりあえずできた。migrate までやっとくか。

db/migrate/001_create_models.rb

class CreateModels < ActiveRecord::Migration
  def self.up
    create_table :models do |t|
      # t.column :name, :string
      t.column :name, :string
      t.column :type_id, :integer
      t.column :use_id, :integer
      t.column :maker_id, :integer
    end
  end

  def self.down
    drop_table :models
  end
end

db/migrate/002_create_purchases.rb

class CreatePurchases < ActiveRecord::Migration
  def self.up
    create_table :purchases do |t|
      # t.column :name, :string
      t.column :serial, :string
      t.column :no, :string
      t.column :purchased_at, :date
      t.column :model_id, :integer
      t.column :vendor_id, :integer
      t.column :status, :string
    end
  end

  def self.down
    drop_table :purchases
  end
end

db/migrate/003_create_uses.rb

class CreateUses < ActiveRecord::Migration
  def self.up
    create_table :uses do |t|
      # t.column :name, :string
      t.column :name, :string
    end
  end

  def self.down
    drop_table :uses
  end
end

db/migrate/004_create_vendors.rb

class CreateVendors < ActiveRecord::Migration
  def self.up
    create_table :vendors do |t|
      # t.column :name, :string
      t.column :name, :string
    end
  end

  def self.down
    drop_table :vendors
  end
end

db/migrate/005_create_makers.rb

class CreateMakers < ActiveRecord::Migration
  def self.up
    create_table :makers do |t|
      # t.column :name, :string
      t.column :name, :string
    end
  end

  def self.down
    drop_table :makers
  end
end

db/migrate/006_create_types.rb

class CreateTypes < ActiveRecord::Migration
  def self.up
    create_table :types do |t|
      # t.column :name, :string
      t.column :name, :string
    end
  end

  def self.down
    drop_table :types
  end
end

冗長ですがご勘弁下さい。で、migrate 実行

$ rake db:migrate
(in /home/xxx/proto)
== CreateModels: migrating ====================================================
-- create_table(:models)
   -> 0.0217s
== CreateModels: migrated (0.0224s) ===========================================

== CreatePurchases: migrating =================================================
-- create_table(:purchases)
   -> 0.0222s
== CreatePurchases: migrated (0.0230s) ========================================

== CreateUses: migrating ======================================================
-- create_table(:uses)
   -> 0.0229s
== CreateUses: migrated (0.0236s) =============================================

== CreateVendors: migrating ===================================================
-- create_table(:vendors)
   -> 0.0227s
== CreateVendors: migrated (0.0235s) ==========================================

== CreateMakers: migrating ====================================================
-- create_table(:makers)
   -> 0.0228s
== CreateMakers: migrated (0.0235s) ===========================================

== CreateTypes: migrating =====================================================
-- create_table(:types)
   -> 0.0227s
== CreateTypes: migrated (0.0234s) ============================================

$

sqlite3 でも確認。

$ sqlite3 db/dev.sqlite3.db
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> .tables
makers       purchases    types        vendors    
models       schema_info  uses       
sqlite> .exit
$

スペジェネ

一応テーブルが六つできているので OK ってコトにしとこう。(何
で、ようやくスペジェネを install。

$ ./script/plugin install http://wota.jp/svn/rails/plugins/branches/stable/special
(出力略
$ ls vendor/plugins/
special
$

とりあえず、config/environment.rb の先頭に以下の記述を追加。

$KCODE = 'u'

カラム一つのソレで special してみる。

$ ./script/generate special Vendor
(出力略
$

基本的に動くと見て、試験サーバ動かしてみる。

$ ./script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-06-20 17:27:37] INFO  WEBrick 1.3.1
[2007-06-20 17:27:37] INFO  ruby 1.8.2 (2005-04-11) [i386-linux]
[2007-06-20 17:27:37] INFO  WEBrick::HTTPServer#start: pid=6198 port=3000

一応起動。開発ホストな 3000 番にアクセス。空ではあるが、情報出力。ローカライズは別途、とゆー事で関連情報をナニしてくれる部分についての盛り込みを。とりあえず、各 model に関連情報を記述。

修正結果はざくっと以下。

$ for i in app/models/* ; do echo $i; cat $i; echo; done 
app/models/maker.rb
class Maker < ActiveRecord::Base
  has_many :models
end

app/models/model.rb
class Model < ActiveRecord::Base
  has_many :purchases
  belongs_to :type
  belongs_to :use
  belongs_to :maker
end

app/models/purchase.rb
class Purchase < ActiveRecord::Base
  belongs_to :model
  belongs_to :vendor
end

app/models/type.rb
class Type < ActiveRecord::Base
  has_many :models
end

app/models/use.rb
class Use < ActiveRecord::Base
  has_many :models
end

app/models/vendor.rb
class Vendor < ActiveRecord::Base
  has_many :purchases
end

$

そろそろ「スペスペシャル」とか言わんといかんのかな (謎
それは良いとして、vendor は先程作成したのですが再度チャレンジ。

$ ./script/generate special Vendor
The DL driver for sqlite3-ruby is deprecated and will be removed
in a future release. Please update your installation to use the
Native driver.
Association Error: Purchase should belong to Vendor
$

む。何だこれは。スペスペシャルを略したのが敗因ですか?
仕方がないので sqlite3-ruby を uninstall

# gem uninstall sqlite3-ruby
Successfully uninstalled sqlite3-ruby version 1.2.1
#

で、WEBrick は動くかな??

$ ./script/server 
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-06-20 17:53:03] INFO  WEBrick 1.3.1
[2007-06-20 17:53:03] INFO  ruby 1.8.2 (2005-04-11) [i386-linux]
[2007-06-20 17:53:03] INFO  WEBrick::HTTPServer#start: pid=6233 port=3000
[2007-06-20 17:53:07] INFO  going to shutdown ...
[2007-06-20 17:53:07] INFO  WEBrick::HTTPServer#start done.
$

動いてる。では、スペスペシャルに再度チャレンジ。

$ ./script/generate special Vendor
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- sqlite3 (MissingSourceFile)
(以下略

駄目だ。ちょっと前に戻って、何故に sqlite3-ruby 入れたのか見てみると、migrate すん時に、だったのか。db 消して再度 migrate してみるか。

$ rm db/dev.sqlite3.db
$ rake db:migrate
(in /home/rms/proto)
rake aborted!
no such file to load -- sqlite3

(See full trace by running task with --trace)
$

うーん。あちらを立てればこちらが立たず。rails のバージョンが微妙なのも原因??

つづき

再度、gem にて sqlite3-ruby を install 今度は 1.2.0 を入れています。又、model も微妙に修正。以下は修正したもののみ。

$ cat app/models/model.rb 
class Model < ActiveRecord::Base
  has_many :purchases
  belongs_to :type
  belongs_to :use
  belongs_to :maker
end
$ cat app/models/purchase.rb 
class Purchase < ActiveRecord::Base
  belongs_to :model
  belongs_to :vendor
end
$

で、migrate から再度実行。

$ rake db:migrate
(略
$ ./script/generate special Vendor
(略
$

上記のエラーメセジ (The DL driver for sqlite3-ruby 略) は出ていましたが、根本的な原因は belongs_to をカンマつなぎで書いていた事が判明。しかも、くまくま本を見るに has_many :through とかを使用した方が良さげ。がしかし、このまま継続。

再び

で、WEBrick 起動してブラウザで見たらオチてる。

  <th><%= association_name(ref) %></th>

db/localized/vendors.yml に associations という定義が入っているはずですが無い、と。無理矢理入れたらブラウザでは表示できたんですが、一旦 destroy した方が良いのだろうか。ちなみに (O) なリンクを辿ると routing error になった。仕方無いので冒険がてら、やってみると

$ ./script/destroy special -r Vendor
(出力略
$

どうも削除されている様子。で、再度 generate を。

$ ./script/generate special -r Vendor
(略
$

で、再度 WEBrick 起動してブラウザ見てみると正常動作な模様。ちょっと現時点での保留事項を以下に整理

  • Model と Purchase と Vendor は has_many :through な関連にした方が良さげ。一旦 Vendor なソレは再度 destroy して関連を調整した後に再度 generate ??
  • ローカライズ
  • Type とか Use とか Maker とかは ViwProperty なソレの方が ??

CRUD なインターフェースだけ完成させて、とっとと Django 方面に着手したい。ってか CRUD なインターフェースとか migrate なんかは rails で他は Django とか??
# びみょー