SSブログ

Railsのモデルの使い方。とfixtures [プログラミング]

いっつもscaffoldとかしか使ってないので、あんまり使ってなかったけど、モデルとテーブルを作るのってのは、scaffoldとは大して違いがないかも。

 rails generate model state statename:string

ってすると、列名がid, statename, created_at, updated_atを持つモデルが作られる。そのモデルを元にデータベースのテーブルを作るには、rake db:migrateで作るってのは同じ。

 
ただscaffoldだと、DBテーブルだけじゃなく、表示されるテンプレートまで作ってしまうので、それを削除するのも面倒ですしね。そこまできっちり作り込まずに場当たり的に作っていたので、そういうきちんとした作り方もこれからしていかないといけないなと思う。

テーブルの関係は、app/models/*.rbのクラスに、has_manyで示す。
class State < ActiveRecord::Base
  has_many :employees
end

副次的なテーブル、例えば、状態の区分けを示す、決め打ちのデータなものを、主テーブルに結びつける場合、上記のようになります。この場合employeesテーブルで、状況であるstatesをそれぞれに使うので、Stateクラス側でhas_manyとしています。


 model名: state
 class名: State
 table名: states

その場合、statesのidカラムを使って、その番号を結びつけて、stringを使うようにしているのかな。元ネタきちんと見てないので分からん。



テーブルを作った次に、実際のテストデータを入れないといけません。test/fixtures/*.yml というファイルを入れて、rake db:fixtures:load でデータを入れていました。入るのは分かったし、DBの中身をリセットする時も、rake db:reset とすればいい事が分かりました。


yamlなりでエクスポートするのには、以前困ったようで前の記事にありました。

 http://miff.blog.so-net.ne.jp/2011-06-20-1


ここを見てRails3でもやってみてみる。

 http://d.hatena.ne.jp/zariganitosh/20070117/1169007400
 http://wota.jp/ac/?date=20060211#p03

やっぱり、そのまんまじゃ無理だな。ちょっとググったら、Object#subclasses_ofは、deprecated(removed?)である事が分かった。Railsだけのメソッドっぽい。


desc "Save fixtures from the current environment's database"
task :"db:fixtures:save" => :environment do
  pre_defined = Object.subclasses_of(ActiveRecord::Base)
  Dir["app/models/*.rb"].each{|i| eval File.basename(i, '.rb').classify}
  (Object.subclasses_of(ActiveRecord::Base) - pre_defined).each{|klass| klass.to_fixture}
end
task :save_fixtures => "db:fixtures:save" # alias




http://stackoverflow.com/questions/4093578/is-there-a-rails-3-replacement-for-subclasses-of

では、

 SomeClass.descendants

にしろということだった(descendentsとtypoがあったけど)ので、変えたらto_fixtureもundefined methodということで、代替するメソッドを調べないとあかんかった。能力がなくて、すぐに解決への道が調べられんかった。

desc "Save fixtures from the current environment's database"
task :"db:fixtures:save" => :environment do
  Dir["app/models/*.rb"].each{|i| eval File.basename(i, '.rb').classify}
  ActiveRecord::Base.descendants.each { |klass| klass.to_fixture }
end
task :save_fixtures => "db:fixtures:save" # alias



ここいらあたりにないか…。

 http://ar.rubyonrails.org/classes/Fixtures.html

create_fixtures()でできんもんかのう。ってコレってセットする方か。やっぱりプラグインとか使っちゃった方が早いかなぁ。早いのは分っているんだけど、自分で分かる範囲で出来るもんなら、そっちの方が訳が分かっていい。

んーすぐに出来そうにない。ここで長い時間を使うのは何なので、先に進む。後々、すごく必要になった時にプラグインなどの使用をひっくるめて考えたい。結局DBマネージャで出し入れした方が簡単で便利でしたとなりそうな気がします。自動化するなら、fixturesの仕組みを使った方がシステム側で使いやすいかもしれないけどね。

しかし、みんなは現状どうやってるんだろうと思ったり、思わなかったり。次回に続く。

タグ:Rails3
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。