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で示す。
副次的なテーブル、例えば、状態の区分けを示す、決め打ちのデータなものを、主テーブルに結びつける場合、上記のようになります。この場合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だけのメソッドっぽい。
http://stackoverflow.com/questions/4093578/is-there-a-rails-3-replacement-for-subclasses-of
では、
SomeClass.descendants
にしろということだった(descendentsとtypoがあったけど)ので、変えたらto_fixtureもundefined methodということで、代替するメソッドを調べないとあかんかった。能力がなくて、すぐに解決への道が調べられんかった。
ここいらあたりにないか…。
http://ar.rubyonrails.org/classes/Fixtures.html
create_fixtures()でできんもんかのう。ってコレってセットする方か。やっぱりプラグインとか使っちゃった方が早いかなぁ。早いのは分っているんだけど、自分で分かる範囲で出来るもんなら、そっちの方が訳が分かっていい。
んーすぐに出来そうにない。ここで長い時間を使うのは何なので、先に進む。後々、すごく必要になった時にプラグインなどの使用をひっくるめて考えたい。結局DBマネージャで出し入れした方が簡単で便利でしたとなりそうな気がします。自動化するなら、fixturesの仕組みを使った方がシステム側で使いやすいかもしれないけどね。
しかし、みんなは現状どうやってるんだろうと思ったり、思わなかったり。次回に続く。
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
コメント 0