2016年9月19日 (月)

[Ruby][Rails][Book] Agile Web Development with Rails 5

Agile Web Development with Rails 5 の Part II まで写経した。

でもって、何か動かないコードがあったりしたら、せっせと errata に投稿していた。 そしたら、電子書籍版の Acknowledgments に名前を載せてもらった。( 紙の本は未確認 )

写経してみて感じたことは、サンプルコードはスクラッチから書かれておらず、Rails 4 で書いていたものを Rails 5に移植したのではないかということ。

Task J:Internationalization の章は多少の手抜きが感じられる。 Task K: Deployment and Production の章はちょっとわかりにくかった。 Task K は、写経というより、適当にdeploy 用の環境を作ってcapistranoを使ってdeployできることを確認する程度で終わってしまった。 まあ、何にせよ、自分も少しは、Railsが少しだけわかるようになってきたという手応えを感じることができたのが、今回の写経の収穫である。

余談だが、Acknowledgements が正しい綴りだと思ってたんだけど、Acknowledgments も正しいことを初めて知った。

電子書籍は今だにβ版のままだな。

| | コメント (0) | トラックバック (0)

2016年2月29日 (月)

[Rails] Rails というか ActiveRecord というか Arel で SQL の case

いろいろ調べてみたが、Rails 5 beta3 でもまだ駄目だった。

<https://github.com/rails/arel/pull/400>

が arel にマージされているので近い将来には、arel を使えば、SQL の case に相当するものを arel を使って書けると思われる。

Rails 5 beta3 でインストールされるのは、arel-7.0.0 だったが、これには 残念ながら、含まれていなかった。

なので、普通に case を文字列で渡してやるしかない。

scope :sel_case_col1, -> { select( "case when col1 = 'AAA' then 'aaa' else col1 end as col1" ) }

| | コメント (0) | トラックバック (0)

2015年8月 1日 (土)

[Ruby][Rails] Rails で DB と連携しない model を作る

Rails 4.2.3 での話。

Rails の model は、データベースとひもづくようになっているのだけど データベースとひもづかない model を作りたいときもある。

Googleで調べてみたら、なんかいろいろコードを書いて実装したりとか、そういう機能だけを提供するgem を見かけたりもしたのだけど 本家本元の RailsGuides にちゃんと書いてありました。

ActiveModel Basics 1.7 Model

ここによると、ActiveModel::Model を include すれば、そのクラスは、validation とか使えるし、 View で form_for で利用することもできると書いてあります。

確認のため、試してみた。

$ rails new model_without_db
$ cd modle_without_db
$ bin/rails c
irb(main):001:0> class FooDb < ActiveRecord::Base
irb(main):002:1> end
=> nil
irb(main):003:0> FooDb
=> FooDb (call 'FooDb.connection' to establish a connection)
irb(main):004:0> FooDb.new
ActiveRecord::StatementInvalid: Could not find table 'foo_dbs'
 ... (以下略)

そうなのだ。ActiveRecord::Base を継承する場合は、ちゃんとテーブル(DB)がないとインスタンスすら作れない。

では、いよいよ、ActiveModel::Model を試してみよう。

irb(main):007:0> class FooWithoutDb
irb(main):008:1> include ActiveModel::Model
irb(main):009:1> end
=> FooWithoutDb
irb(main):010:0> FooWithoutDb
=> FooWithoutDb
irb(main):011:0> FooWithoutDb.new
=> #<FooWithoutDb:0x007f64080fbdb0>
irb(main):012:0>

おおっ。インスタンスができてる。ってこれだけじゃ意味ねーじゃん。ということで、validation も使えるか試してみる。

irb(main):012:0> class FooWithoutDb
irb(main):013:1> attr_accessor :foo
irb(main):014:1> validates :foo, presence:true
irb(main):015:1> end
=> {:presence=>true}
irb(main):016:0> foo = FooWithoutDb.new
=> #<FooWithoutDb:0x007f64080976d0>
irb(main):017:0> foo.valid?
=> false
irb(main):018:0> foo.foo = 'hogehoge'
=> "hogehoge"
irb(main):019:0> foo.valid?
=> true

おおっ。ちゃんと validation も使えそう。

このあと、もうちょっと試してみたけど、実際に app/model 配下に、ActiveModel::Model をinclude したクラスのファイルを作って View とちょっとだけ連携してみたら、それっぽく動作してくれた。 Rails も便利になったものです。(機能が増えすぎて複雑怪奇になっているとも...)

FooWithoutDb.build や FooWithoutDb.create は使えないので、RSpecとかでテスト書くときには、注意した方がいいかも。

ちなみに、ActiveModel Basics は、'Work in progress' (2015-08-15現在)なので まだまだ新しい情報が追加されるかも知れません。

残念ながら、日本語翻訳ページの Active Model の基礎 には、この説明がまだありません(2015-08-15現在)。

続きを読む "[Ruby][Rails] Rails で DB と連携しない model を作る"

| | コメント (0) | トラックバック (0)