fc2ブログ

2023.11 «  - - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - - - - - » 2024.01
TOP > CATEGORY > migration初体験

TOP | NEXT

migration初体験06【ラジオボタンの選択肢を一覧画面や詳細画面に表示】 

2007年06月07日 ()
ただいま、性別ラジオボタンの選択肢の値として、m と f が選べます。

でも、ただ m とか f というのを一覧画面(list)とか詳細画面(show)に表示しても意味が分かりづらいので、male とか female という文字列を画面に表示したいのです。

すると、どこかで変換が必要になるはずですが、さっきから調べまくっているのですが、やり方が分かりません。

私の記事には珍しく、断念状態になってしまいました。

キー、悔しい。

また、幾ばくかの年月を経て、解決法が分かったら掲載します。

もちろん恵まれない私に愛のヘルプをいただけましてもベリーグーです。

ああ、今夜は悶々としながら床に伏すことでしょう。おやすみなさい。

[追記 07/08/07]
結構 rails も分かってきたところで、↑も出来るように思ってきました!

詳細は書きませんが、genders みたいなマスターテーブルを作って、それを元に、選択肢とその値を表示すればいいと思います。

値が m とか f とかだったりした場合は、それを list に表示するには、has_many :genders を Book モデルに、belongs_to :book を Gender モデルに書いて、うまくやれば OK だと思います。

この詳細、やる気になれば後で書いてみようかと思います。特にコメント欄にリクエストなどあれば、バリバリやる気が出ます!

【広告】

スポンサーサイト



[2007.06.07(Thu) 01:36] migration初体験Trackback(0) | Comments(0) 見る▼
↑TOPへ

migration初体験05【追加カラムを編集できるようにviewをいじる】 

2007年06月05日 ()
今回は、年齢と作者の性別を画面から入力・一覧できるようにしたいと思います。

一覧画面 http://localhost:3000/book/list を開きますと、何もしなくても、勝手に Price と Gender の値が一覧表示されています。ステキ!ラブラブ!

そいで、新規作成画面を開きますと、追加した Price と Gender を入力するテキストボックスなりなんなりが表示されていません。

やっぱりそんなにすんなり全部やってくれるわけがないですよね。

そこで気合い入れて、画面表示に手を入れます。

画面表示といえば、view ですよね。

さっそく view ディレクトリのファイルをみてみることにします。

# ls -1 app/views/book

_form.rhtml
edit.rhtml
list.rhtml
new.rhtml
show.rhtml



新規作成画面で、追加した Price と Gender の入力するテキストボックスとかがなかったので、new.rhtml ファイルの中身をみてみますと、

<h1>New book</h1>

<% form_tag :action => 'create' do %>
  <%= render :partial => 'form' %>
  <%= submit_tag "Create" %>
<% end %>

<%= link_to 'Back', :action => 'list' %>



うわー、全然 Title とか Author とかのかけらもありません。いったいどうなってるのこの島は?

そこで、こっそり存在している謎のファイル _form.rhtml をのぞいてみますと、

<%= error_messages_for 'book' %>

<!--[form:book]-->
<p><label for="book_title">Title</label><br/>
<%= text_field 'book', 'title' %></p>

<p><label for="book_author">Author</label><br/>
<%= text_field 'book', 'author' %></p>
<!--[eoform:book]-->



となっています。なんか共通で使い回してんのかなー?と思い、Price と Gender の分も付け加えてみました。

<%= error_messages_for 'book' %>

<!--[form:book]-->
<p><label for="book_title">Title</label><br/>
<%= text_field 'book', 'title' %></p>

<p><label for="book_author">Author</label><br/>
<%= text_field 'book', 'author' %></p>

<p><label for="book_price">Price</label><br/>
<%= text_field 'book', 'price' %></p>

<p><label for="book_gender">Gender</label><br/>
<%= radio_button 'book', 'gender', 'm' %>male
<%= radio_button 'book', 'gender', 'f' %>female</p>
<!--[eoform:book]-->



いい感じです。

あと1点気になるのは、リスト表示とか、完了画面とかに、Gender が、「m」とか「f」とかいう実際 DB に入っている生の値が表示されるのです。

そこんとこ、「male」とか「female」とかに表示をさせたいのです。

というのは次回にするか。やり方が分からないけども。がんばってインターネット様にお伺いいたします!


【広告】

[2007.06.05(Tue) 20:42] migration初体験Trackback(0) | Comments(0) 見る▼
↑TOPへ

migration初体験04【migrationファイルを使ってDBを変更】 

2007年06月05日 ()
さて、いよいよ準備したmigrationファイルを使って、DBを変更します。

長引いてしまってすっかり忘れてもうたのですが、何のカラムを追加したかったかというと、価格カラムと、作者の性別カラムを加えたかったのでした。

価格カラムは、整数型・デフォルト値 0・nullは許さない
作者の性別カラムは、文字列型(1)・デフォルト値 m・nullは許さない

にしたいと思います。

それから作者の性別は、m が男を、f が女を画面上で表すようにしたいです。

というわけで、migration ファイルに追加する行は、みようみまねで、

      t.column "price", :integer, :default => 0, :null => false
      t.column "gender", :string, :limit => 1, :default => "m", :null => false



でしょうね。おそらくは。(勘でやってしまえそうなところが rails のスゴいところかもしれません)

そんな訳で、新しくなった migration ファイルは

class NewColumnsOnBooks < ActiveRecord::Migration
  def self.up
    create_table "books", :force => true do |t|
      t.column "title", :string, :limit => 400, :default => "(no title)", :null => false
      t.column "author", :string, :limit => 500, :default => "(no author)", :null => false
      t.column "price", :integer, :default => 0, :null => false
      t.column "gender", :string, :limit => 1, :default => "m", :null => false
    end
  end

  def self.down
  end
end



となりました。あとは、

# rake migrate



と入力してみましょう。

== NewColumnsOnBooks: migrating ===============================================
-- create_table("books", {:force=>true})
-> 0.1523s
== NewColumnsOnBooks: migrated (0.1579s) ======================================

The rake task migrate has been deprecated, please use the replacement version db:migrate



と、またエラーがでました。がくりくりくり。

コマンドがナウくないらしいので、いわれた通りにコマンドを打ち直します。

# rake db:migrate



はい、なんのメッセージも表示されないで、終了しました。何が起きたかわかんないよー。

でも、booksテーブルを確認したら、priceカラムとgenderカラムが増えていました。

そして、schema_infoというテーブルも増えていました。

これは、rake db:migrate のバージョンが今なんだろうか、という管理をするテーブルだそうです。

しかしここで大問題発生!!booksテーブルに入っていたデータがすべて消えました。がくりくりくり。

どうやら、migration ファイルに入っていた記述 :force => true のせいのようです。

では、データを消さずに migration するには、どうしたらいいか、というと、add_column っつーのを使えばいいそうです。

その場合の migration ファイルの中身は、こんな感じ↓になると思います。

class NewColumnsOnBooks < ActiveRecord::Migration
  def self.up
    add_column "books", "price", :integer, :default => 0, :null => false
    add_column "books", "gender", :string, :limit => 1, :default => "m", :null => false
  end

  def self.down
  end
end



遠回りをしてしまったようですが、まあ、落ち着くべきところに落ち着いたという感じですか。

で、ど素人の私は、rake migrate をすると、追加したカラムの分だけ画面表示も勝手に変えてくれると思ったのですが、そうは問屋がおろさない、というわけで、手動で画面とか model とかを直さなくてはならないです。

というのは次回にやりたいと思います。

【広告】

[2007.06.05(Tue) 02:04] migration初体験Trackback(0) | Comments(0) 見る▼
↑TOPへ

migration初体験03【現在のDBテーブルをmigrationファイルに反映】 

2007年06月03日 ()
migration ファイルに書ける既存の DB の情報をどーにかして作りたいのです。

そこで登場するのが、インターネット様。既存のDBからmigration定義ファイルを作るにはを参考に、既存のテーブルから migration ファイルを引っ張ってみましょう。

myFirstというrubyプロジェクトがあるとして、

# cd myFirst
# rake db_schema_dump



としましたら…オイオイ、エラーが出ました。

The rake task db_schema_dump has been deprecated, please use the replacement version db:schema:dump



db_schema_dump の書き方はフルイんだそうです。もうこんなに進歩が早くてついていけるかしらん。

改めて、

# rake db:schema:dump



をやりましたら、エラーが表示されませんでした。その代わり何にも表示されませんでした。

これじゃどーすればいいのかまた途方に暮れますが、いろいろな場所を島田紳介さん以上に探し回りました。

そしたら、見つけましたよ、db ディレクトリの下に、新しく schema.rb ファイルが出来ているのを。

schema.rbの中身は、

ActiveRecord::Schema.define() do

  create_table "books", :force => true do |t|
    t.column "title", :string, :limit => 400, :default => "(no title)", :null => false
    t.column "author", :string, :limit => 500, :default => "(no author)", :null => false
  end

end



このコードのうち、create_table から、次の end までを db/migrate/001_new_columns_on_books.rb の、def self.up から、次の end までコピペします。

つまり、db/migrate/001_new_columns_on_books.rb はこういう風になります。

class NewColumnsOnBooks < ActiveRecord::Migration
  def self.up
    create_table "books", :force => true do |t|
      t.column "title", :string, :limit => 400, :default => "(no title)", :null => false
      t.column "author", :string, :limit => 500, :default => "(no author)", :null => false
    end
  end

  def self.down
  end
end



これで、現在のテーブルの形での migration ファイルが出来上がりました。

次回は、これにカラムを付け加えて、いよいよ rake migrate コマンドを使用してみたいと思います。



【広告】

[2007.06.03(Sun) 01:12] migration初体験Trackback(0) | Comments(0) 見る▼
↑TOPへ

migration初体験02【migrationファイル自動生成】 

2007年06月01日 ()
おかーをこーえーゆこーうよー。

DBのテーブルにカラムを追加したいんだよ、といった場合、rake migrate というコマンドで、DB構成をバージョンアップしたりバージョンダウンしたりできるようです。

rake migrate コマンドを使わずに、手動でSQLを使っても、もちろんDB構成を変えることができますけどね。

rake migrate コマンドを使うために、まず migration ファイルというファイルを作らねばならないらしいのです。

そんな時には、script/generate ですよ。

myFirstというrubyプロジェクトがあるとして、

# cd myFirst
# script/generate migration newColumnsOnBooks
      exists db/migrate
      create db/migrate/001_new_columns_on_books.rb



出来ましたねえ、001_new_columns_on_books.rb ファイルが。

ちなみに 001 というのは、バージョン番号です。script/generate migration コマンドを打つたびに、1ずつ増えたファイルが新規作成されます。

なので次に script/generate migration コマンドを打つと、002_ほにゃらら.rb ファイルが作成されることでしょう。

では早速 migration ファイルの中を覗いてみましょう。

class NewColumnsOnBooks < ActiveRecord::Migration
  def self.up
  end

  def self.down
  end
end



がーん、何もDBの中身について書いてないです。

どうやら既存のDBのスキーマ変更する前に、migration ファイルに書ける既存の DB の情報をどうにか作りださねばならないみたいですね。

というのは次回やろうと思います。


【広告】

[2007.06.01(Fri) 11:49] migration初体験Trackback(0) | Comments(0) 見る▼
↑TOPへ

TOP | NEXT