• ブログ
  • ふぉとす
  • キーワード
  • ブックマーク
  • 写真
  • ログイン

Title

« Wavesを試してみる - View編 | テーブルにインデックスをはると、insertの速度が遅くなる »
  • Wavesを試してみる - Model編 2008-03-15 14:51:44

     引き続きWavesを試してみます。
     チュートリアルによると、entryに1:nでcommentモデルとの関連付けをしています。
     まずはCommentsテーブルのmigrationを作成します。

    rake schema:migration name=add_comments
    

    で、schema/migrations/002_add_comments.rbを編集。

    class AddComments < Sequel::Migration
    
      def up
        create_table :comments do
          primary_key :id
          foreign_key :entry_id, :table => :entries
          text :name
          text :email
          text :content
          timestamp :created_on
        end
      end
    
      def down
        drop_table :comments
      end
    
    end
    

     そういえば、RailsではDBレベルでforeign_keyをあまりつけてないな。あと、created_onはSequelによって自動的に時刻が入るよう。Railsでいうcreated_atだね。created_onだと日付しか入らないみたいな感じがしてしまうのは、Railsの使いすぎか。ちなみにSequelというのはORMです。
     migrateをかましたら、Entryモデルを作成します。ていうか、今まで存在しなかったのかよ。デフォルトの動作がWavesの中で定義されていて、それ以外のことをやりたくなったときにはじめてコードを書くのかな。

    rake generate:model name=entry
    

    で、models/entry.rbが作成される。

    module Blog
      module Models
        class Entry < Sequel::Model(:entries)
          before_save do
            set(:updated_on => Time.now) if columns.include? :updated_on
          end
        end
      end
    end
    

    before_saveはRailsと一緒かな。テーブルがupdated_onを持っていたら更新してくれるみたい。created_onはSequelでやってくれるのに、updated_onは自前でやるのか。中途半端だなあ。Wavesが勝手にコード吐いてくれるけど。
    で、models/default.rbの中身がこれと一緒になっている。明示的にモデルを作成しなかったときは、default.rbが使われるんだな。たぶん。
    さて、models/entry.rbにcommentmモデルとの関連付けを定義しましょう。

    one_to_many :comments, :from => Blog::Models::Comment, :key => :entry_id
    

    こいつをbefore_saveの下に追加します。Railsでいうところのhas_manyと一緒だね。相手のモデルと参照キーを指定してやんないといけない。fromって、なんだかぼくの認識だと参照先みたいな感じがしてしまう。
    つづいてcommentモデルを作成する。

     rake generate:model name=comment
    

    models/comment.rbは

    module Blog
      module Models
        class Comment < Sequel::Model(:comments)      
          before_save do
            set(:updated_on => Time.now) if columns.include? :updated_on
          end
          one_to_one :entry, :from => Blog::Models::Entry
        end
      end
    end
    

    one_to_oneはRailsでいうbelongs_toだな。ここでのfromは違和感がない。

    さて、viewのほうにコメントを追加してみます。チュートリアルからちょっとアレンジしてみます。templates/entry/show.mabは

    layout :default, :title => @entry.title do
      a "すべて見る", :href => '/entries'
     
      h1 @entry.title
      textile @entry.content
    
      h2 "コメント"
      view :comment, :add, :entry => @entry
      view :comment, :list, :comments => @entry.comments
    end
    

    こんな感じ。見てわかるように、@entry.commentsみたいな感じでAR的にリレーション先へアクセスできるようです。
    さて、add.mabとlist.mabをtemplates/commentディレクトリ下に作ります。
    templates/comment/add.mab

    form :action => "/comments", :method => 'POST' do
      input :type => :hidden, :name => 'comment.entry_id', :value => @entry.id
      label "名前"; br
      input :type => :text, :name => 'comment.name'; br
      label "Email"; br
      input :type => :text, :name => 'comment.email'; br
      label "コメント"; br
      textarea :name => 'comment.content', :rows => 10, :cols => 80; br
      input :type => :submit, :value => "書き込み"
    end
    

    POST先のURLが/commentsになっている。RailsみたいなURL(/entries/:id/comments)じゃないね。かわりに、hidden fieldを持っていて、そこにentry_idを入れている。これだと、URLはシンプルになっていいかも。REST的にはRailsの方が正しい気もするんだけど。
    それから、templates/comment/list.mab

    @comments.sort_by( &:created_on ).each do |comment|
      name = ((comment.name.nil? or comment.name.empty?) ? "通りすがり" : comment.name)
      p %Q|#{name} #{comment.created_on.strftime("%Y-%m-%d %H:%M")}|
      textile comment.content
    end
    

    チュートリアルのコードはわかりにくくて好きじゃない感じだったので書き直してみました。

    で、実際にコメントを書いてみると、/comment//editorなんていうURLに飛ばされるのだけど、当然404になる。いよいよルーティングを定義する必要があるみたい。続きはまた今度にしよう。

    Commentコメント(0) Pageリンク元(22) Append 399
  • 風の大陸〈第26部〉聖都 (富士見ファンタジア文庫)
    メディア: 文庫
    チャレンジャーの死闘〈下〉―銀河の荒鷲シーフォート (ハヤカワ文庫SF)
    作者/アーティスト: David Feintuch,野田 昌宏
    メディア: 文庫
« Wavesを試してみる - View編 | テーブルにインデックスをはると、insertの速度が遅くなる »

プロフィール

おおいしつかさ

Amazon商品の一覧

人気の記事ベスト10

  • 1.apache+mod_proxy_balancer+mongrelでRailsを動かす方法
  • 2.Perlでevalを使ってみる
  • 3.バージョン管理をsubversionからgitに移行してみた
  • 4.tokyobikeのドロップハンドル化
  • 5.ubuntu8.04でデュアルディスプレイを使う
  • 6.restful_authenticationを使ってみた
  • 7.URLなど、長い英字を折り返して表示する方法
  • 8.Rspecでコントローラのspecファイルを書く
  • 9.RailsとPostfixで受信メールを処理する方法
  • 10.フラグメントキャッシュをRailsで使う。

コメント

  • ユル(プログラマが若隠居をしたら)
  • ユル(風邪ひいた)
  • ユル(バイクがへたくそになっていた)
  • おおいしつかさ(便利になって不便になる)
  • 武石(便利になって不便になる)
  • ユル(劇場版 天元突破グレンラガン)
  • ユル(フラニーとゾーイー (新潮文庫): サリンジャー, 野崎 孝: 本)

過去の記事

2006年
12月
2007年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月

キーワード一覧

ActionScript AmazonResources git javascript kaeruspoon milook NSR Objective-C Rails Ruby Ruby on Rails subversion Thin tokyobike ubuntu VAIO VAIO typeZ Waves Xen ぐりぐり カンタロー スノボー ドトール ドライブ バイク プログラミング ユルさん 執筆 日本酒 模型 真中洋嗣 自転車

Youtube

ニコニコ動画