My Brain is Open.

思いついたことを適当に列列と

Fabrication

FabricationというのがMongoidのドキュメントに対応しているらしいので、テストの為に使ってみる。

とりあえず、次の事はわかった。

  • spec/fabricators/model_fabricator.rb で Fabricator(:model)を作成。
  • Fabricate(:model)でモデルを作成し保存。いろいろ試す。

今問題なのは、Fabricator作成時にembed documentをどう記述するか。

Mongoid側のドキュメントにある例が参考になりそうなので、やってみよう。
http://mongoid.org/docs/extensions/

[2010-11-25 追記]
次のような埋め込みドキュメントのモデルを想定する

class Person
  include Mongoid::Document
  field :name, :type => String
  embed_many :phones
end

class Phone
  include Mongoid::Document
  field :number, :type => String
  embedded_in :person, :inverse_of => :phones
end

このときFabricatorはそれぞれこんな感じ。

Fabricator(:person) do
  name "hogehoge"
  phones(:count => 3) { |phone,i| Fabricate.build(:phone, :number => "090-0000-000#{i}") }
end

Fabricator(:phone) do
  number "03-0000-0000"
end

ポイントはPhonesというMongoDBのコレクションが無いため、Fabricate.buildを用いてsaveしないようにする事。
たったこれだけだった。

[2011-01-15 追記]
embeds_manyの場合、上記の例での :count => 3 という部分が無いとエラーになる。
これはおそらく "<<" で挿入してくのではなく "=" で代入するように作用するためだろう。

nokogiri 1.4.4でエラー

Ruby on Railsで業務アプリを構築中。

将来必要になるだろうjpmobileを入れてみたところ、入るバージョン0.1.3ではwebratを使用しており、その依存関係でnokogiriがインストールされる。
開発マシンのMac OS X 10.6ではそこでエラーが発生。
mkmf.logはこんな感じ。

have_func: checking for iconv_open() in iconv.h... -------------------- no

"gcc -o conftest -I/usr/include/ruby-1.9.1/x86_64-darwin10.4.0 -I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I. -I/opt/local/include/libxml2 -I/usr/local/include/libxml2 -I/opt/local/include -I/usr/local/include -I/usr/include -I/usr/include -I/usr/include/libxml2 -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE    -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long  -pipe  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline conftest.c  -L. -L/usr/lib -L/opt/local/lib -L/usr/local/lib -L/usr/lib -L.      -lruby-static  -lpthread -ldl -lobjc  "
Undefined symbols:
  "_libiconv_open", referenced from:
      _t in ccKMdG8x.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

どうも、iconvライブラリの読み込みでうまくいってない感じ。

ググってみるとnokogiri 1.4.1の動作報告はガンガン出てるので、以下をGemfileに挿入。

gem 'nokogiri', '1.4.1'

うまくいきました、と。

(追記)Nokogiriインストール時に入れたlibxml2のバージョンが求めるものと違っていたようで、railsコマンドの度にずっと警告が出てる。

WARNING: Nokogiri was built against LibXML version 2.7.8, but has dynamically loaded 2.7.3

どうってことは無いのだが、気になる人は libxml2.7.3 にすべきだろう。私は面倒なのでこのままにする。