composite_primary_keys 2.3.5.1でサーバ起動しない

以前作成したアプリケーションにおいて、プロジェクト管理者の意向で複合キーを利用したDB設計とした上でRuby on Railsのアプリケーション設計を行った。
Ruby on Railsでは複合キーをサポートしていないため、対応するにはcomposite_primary_keysを用いればよい。
ただ、モデルにvalidateを記載する等で複合キーによるユニーク規制は出来るため、DB自体は別に複合キーで設計しないで良いため、以降のアプリケーション作成ではcomposite_primary_keysを用いていなかった。

今回、久々にそのcomposite_primary_keysを利用したアプリケーションを触る機会があったため、開発端末で動かそうとするが、以下のエラーが発生し、サーバが起動しなかった。


C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:233:in `activate': can't activate activerecord
(>= 2.3.5, runtime) for ["composite_primary_keys-2.3.5.1"], already activated
activerecord-2.3.3 for ["rails-2.3.3"] (Gem::LoadError)

散々悩んだが、どうやらどこかのタイミングでcomposite_primary_keysのバージョンが2.3.2から2.3.5.1までアップデートされたために、発生したエラーのようである。
下位互換が不十分だなんてことがあるのか?
自分の環境がおかしいのかもしれない。
composite_primary_keysをバージョン指定で起動できないか、色々調べてみたがさっぱりだった。
仕方ないので、composite_primary_keysの2.3.5.1をアンインストール。

すると動いた。

ただし、以下の警告文が出ている状態。


C:/Ruby/lib/ruby/gems/1.8/gems/rails-2.3.3/lib/rails/gem_dependency.rb:119:Warning:
Gem::Dependency#version_requirements is deprecated and will be removed on or after August
2010. Use #requirement

これは引き続き確認してみる。

collection_selectでの初期値設定

がっつりはまってしまった。

Railsにはcollection_selectという便利なメソッドが存在する。
こいつは、form_forメソッド内にドロップダウンリストを作成する際に利用すると、オブジェクトからドロップダウンへの表示項目とform_forへと送る値とを任意に指定できる優れもの。
実際の利用はこんな感じ。


<% form_for(@book) do |f| %>
<%= f.collection_select 'publisher_id', Publisher.find(:all), :id, :name %><% end %>

上記の例では、たとえばPublisher内に、nameが「小学館」「集英社」「講談社」、idは左から1,2,3というデータがあったとしたら、画面上には下のように表示される。
ここで「集英社」を選択すると、@bookのpublisher_idには 2 がセットされるといった処理になる。 このため、コードマスタ等に設定していたモデルから値を紐付けて取得することが非常に容易で、便利になる。 さて、ここからが今回の本題。 以下のようにすると、修正画面での初期表示がおかしくなる。

<% form_for(@book) do |f| %>
  <%= f.collection_select 'genre_id', Genre.find(:all), :id, :name %>
  <%= f.collection_select 'publisher_id', Publisher.find(:all), :id, :name %>
<% end %>
一つのform_forメソッド内に複数のcollection_selectメソッドを記述すると(たぶん)edit画面等の既に入力されている情報を取得する際に初期値が異なって指定される。 具体的に書くと以下のようなケースになる まず、genreにミステリー(idが2とする)publisherに講談社を指定して登録する。 DBにはgenre_idが2, publisher_idが2で登録される。 次にこのデータを変更しようと修正画面を開くと、genreにミステリー、publisherに小学館と表示される。 collection_selectの謎。 - railsでhogehogeを作ってみる。 このサイトの人なんかも、同様の事象に陥ったみたい。 初期値を任意に指定できないかを探したが、さっぱりだったのでselectメソッドを利用した。
<% form_for(@book) do |f| %>
  <%= f.select 'genre_id', @genre %>
<% end %>
コントローラでの記載は以下の通り。
genre = Genre.find(:all)
i = 0
while genre[i] != nil
  @genre << [genre[i].name, genre[i].id.to_i]
end
配列の入れ子を追加しているが、入れ子の2つ目の要素がStringの場合、どうも上手くいかなかった。 試しにto_iメソッドを利用すると上手く表示されるようになった。 無駄なコードが増えるが、仕方がないからこれでよいことにする。 後、コントローラでのコーディングがイケてない気がするけど、力尽きたので今日は以上。

mislav-will_paginateでのSQL文指定

Ruby on Railsには便利なプラグインが数々あるが、その中でも代表的なのが、will_paginateだと思われる。

http://holy.enyou.org/2009/01/27/move-to-mislav-will-paginate/
ポンクソフト

上記のサイトにも記載されているが、will_paginateはmislav-will_paginateへと移行?されているため、インストール時には注意が必要。
また、config.rbの編集も忘れずに実施。

will_paginateのページ送り機能は便利だが、オプション指定無しに実施すると表示順がID順等、テーブル構造からそのまま抽出してしまう。
そこで、調べてみたらpaginate_by_sqlという便利なメソッドがあることが判明。
第一引数にSQL文を直接書ける。
コントローラに下記のように記載すればOK。


@books = Book.paginate_by_sql("select * from books order by rating desc",
:page => params[:page], :per_page => 10)
booksテーブルからratingを降順にした全件を取得できる。

railsのPDF作成-prawnでの表作成

前回に引き続き、railsでの帳票作成について。
prawnを用いるとrubyで簡易に帳票作成が行える。
それをrails上で利用できるように作成されたのが、prawntoだそうだが、今ひとつprawntoの利点が見えてこない。
その点は余裕があったら調査するとして、prawnだけを用いてのPDF作成について。
前回は検証中だった表作成を行ってみる。

コントローラーには以下の記述。


def create_pdf
Prawn::Document.generate("#{RAILS_ROOT}/public/test.pdf", # PDFファイルの出力先
:page_layout => :landscape, # 横
:page_size => "A4",
:left_margin => 36,
:right_margin => 24,
:top_margin => 24,
:bottom_margin => 24) do
font "#{RAILS_ROOT}/public/ipag.ttf" # IPAフォントを配置したパスを指定
text 'テスト帳票'
i = 1
size = ['Small', 'Middle', 'Large']
price = Hash.new
price['Small'] = 9.00
price['Middle'] = 10.50
price['Large'] = 12.00
@table = Array.new
# 各行の値を設定*10。無駄に乱数なんかも使ってみる。
10.times do
value = size[rand(3)]
@table << [i, value, price[value] ]
i += 1
end
table @table,
:headers => %w[No サイズ 価格],
:row_colors => %w[eeeeee ffffff],
:align => { 0 => :right, 1 => :center, 2 => :right },
:align_headers => :center,
:width => 770
# :widths => {0 => 200, 1 => 80, 2 => 80}は機能しなかった。
end

send_file("#{RAILS_ROOT}/public/test.pdf", :type => "application/pdf",
:disposition => 'inline')

end

ボタンクリックでPDF作成できるように、ビューには以下を記述。

<%= link_to 'PDF作成', :action => :create_pdf %>

で、作成されたPDFがこんな感じになる。
※どうやら、ブログ上にPDFのアップロードは出来ない(面倒)なようなので、画像を掲載。

割と簡単に出来るみたい。
ただし、widthsの指定が上手く出来なかった。これがないと自動で列幅を指定されてしまうため、難しいかも。
また、一つのセルに2行書く様な場合等、ちょっと複雑な形式になっただけで対応できなくなってくるかもしれない。
PGをごりごりやればできるかもしれないけど。

ただ、簡単にPDF作成が出来るのは間違いないので、単純な帳票作成が必要なときは良いのでは。

個人的には、行の色分けが簡単に行えるのはかなり使えると感じた。

railsでのPDF作成 prawnto

Ruby on RailsでのPDF作成用のプラグインとして、Prawntoが存在する。
下記のサイトあたりで説明されている。

Rails:prawn & prawntoで日本語のPDF生成 - satoko's blog - s21g
http://doruby.kbmj.com/nakahira_on_rails/20100611/ruby_on_rails_PDF__prawnto_Plugin_

ただし、何故かprawntoのインストール部分でvender配下にprawntoフォルダのみが作成されており、prawntoの呼び出し時に undefind method エラーが発生していた。

仕方ないので、githubから、prawntoのソースをダウンロードして適用。
http://github.com/thorny-sun/prawnto
何とか動いた。

railsでの帳票作成は何かと難点が多いが、割と簡単に書ける気がした。
表の作成についての検証を行っているため、気付きを後ほどまとめる。

はじめに

仕事の上でプログラム開発を行っています。
現在は、Rubyを用いた開発を主に行っていますが、自分自身の備忘録と多少なりとも他人の手助けになればとブログ作成します。

仕事の合間を縫って作成していくため、ただのチラシの裏になる気が。