@kashiokaです。
アップが遅くなってしまいすいませんm(__)m

CakePHP Advent Calendar 2011の5日目を書かせていただきます。

ブログの移転を行うのに、バックアップを忘れてしまい。
googleのキャッシュからサルベージするという地道に作業を行ったのですが。
その際、昔のアクセスの多かったものについてリダイレクトの処理を入れてました。
(wordpressのプラグイン「Redirection」凄く便利です。)

そこでcakeのページを見たところ
複数形のページのアクセスが結構多かったため、このテーマをもう少し書いてみたいと思います。

bakeでモデルの生成の生成を行うと
Given your model named ‘Information’, Cake would expect a database table named information
というように言われる場合があります。
bakeの場合は結局は
Do you want to use this table? (y/n)
と聞かれて確認できるのですが、bakeしないで作成した場合等は注意が必要です。

CakePHPではテーブルの参照では、モデル指定の複数形が指定されます。
モデルbookであればbooks等
しかし上記エラーのようにinformationを指定した場合は、テーブル名はinformationとなります。
英語力無い、私だけかもしれませんが
よくモデルInformationを作成しては「DBつながらねー」見たいなことに陥ります。

基本的には規約にあったモデル名を使用するのが良いと思います。
どうしても規約に乗りたくない場合は

モデルの定義で
class Hogehoge extends AppModel {
var $name=’User’;
var $useTable=’Users_no_table_mei’;

のようにしてテーブル名を指定することが出来ます。

ちなみにこの処理を行っているのは
libs/inflector.php
でここに
単数形->複数形
複数形->単数形
複数形でも変わらない単語の処理が書いてあります。
一度、のぞいてみてください。

で話を戻しますが、元々のエラーのInformationは複数形もInformationなのです。
(自分でデータベース作ったりするとInformationsで作ったりして困ります。)

DBが参照出来ないときとか、一度複数形を疑ってみてみましょう!
とりあえずは辞書検索とか、、、(笑

ちなみに、この部分バグもあったみたい
http://cakephp.lighthouseapp.com/projects/42648/tickets/2149

1系ではnode_mediaというのが正しく表示されないようです。2で直っているようです。
(てかnode_mediaってなんだ?)

複数形にどんな風に変換されるかは
include_once(“cake/libs/inflector.php”);
$word = “node_media”;
echo “pluralize:”.Inflector::pluralize($word);

とかでできます。(cakephp的にしてなくてすいません)

ヘルパーにするなら
http://debuggable.com/posts/cakephp-pluralize-helper:480f4dfe-fbf8-464a-95da-4764cbdd56cb
にありました
class PluralHelper extends Helper {
function ize($s, $c) {
if ($c != 1) {
return $c . ‘ ‘ . Inflector::pluralize($s);
}
return $c . ‘ ‘ . $s;
}
}
のような感じでこのクラスを利用することができます。

ありがちなパターンでpeopleやwomanとか注意です!
ということで中学生の英語の授業って大切ですねw

少しでもinformationで繋がらない人が減ればと思います。

追記:次の@k1Lowさんから

CakePHPにおける複数形はCakePHP自体がどう判定するのかがInflectorクラス次第ですからね。
ちなみにcake.elはInflectorクラスをEmacs Lispでインプリメントして利用しているので安心です。

とのコメントいただきました。Emacs使いな方は試してみてください。
私はVi派なので、、、

雑文で失礼しました。

次は@k1LoWさんです!
みなさん、お楽しみに