« [Ruby] error_messages_for in Rails 3 (続き) | トップページ | [Soft] cygwin上のVim の autocomplpop と neocomplcache »

2011年8月14日 (日)

[Ruby] ActiveRecord の find と where

Active Record Query Interface 3.0 によれば、

find(:all, options)

のような書き方は、Rails3.2 では、できなくなるらしい。

どちらの書き方をしても、ほぼ、気にすることなく扱うことができそうなのだが、 実は、find メソッドが返すのはArrayオブジェクトで、 whereメソッドが返すのは、ActiveRecord::Relationオブジェクトなので取り扱いには注意が必要 (Rails 3.0.9 での話)。

たとえば、合計を計算しようとして sum メソッドを呼び出す場合など。

$ rails -v
Rails 3.0.9
$ rails new test01
$ cd test01
$ rails g scaffold book title:string price:integer
$ rake db:migrate
$ rails console
Loading development environment (Rails 3.0.9)
irb(main):001:0> book = Book.new(title:'Programming Ruby', price:25)
=> #<Book id: nil, title: "Programming Ruby", price: 25, created_at: nil, updated_at: nil>
irb(main):002:0> book.save
=> true
irb(main):003:0> Book.find(:all, conditions:{title:'Programming Ruby'})
=> [#<Book id: 1, title: "Programming Ruby", price: 25, created_at: "2011-08-13 22:55:27",
updated_at: "2011-08-13 22:55:27">]
irb(main):004.0> Book.where(title:'Programming Ruby')
=> [#<Book id: 1, title: "Programming Ruby", price: 25, created_at: "2011-08-13 22:55:27",
updated_at: "2011-08-13 22:55:27">]
irb(main):005.0> Book.find(:all, conditions:{title:'Programming Ruby'}).sum{|b| b.price}
=> 25
irb(main):006:0> Book.where(title:'Programming Ruby').sum{|b| b.price}
ArgumentError: wrong number of arguments (0 for 1)
...
irb(main):007.0> Book.find(:all, conditions:{title:'Programming Ruby'}).class
=> Array
irb(main):008.0> Book.where(title:'Programming Ruby').class
=> ActiveRecord::Relation
irb(main):009:0> Book.where(title:'Programming Ruby').sum(:price)
=> 25

|

« [Ruby] error_messages_for in Rails 3 (続き) | トップページ | [Soft] cygwin上のVim の autocomplpop と neocomplcache »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [Ruby] ActiveRecord の find と where:

« [Ruby] error_messages_for in Rails 3 (続き) | トップページ | [Soft] cygwin上のVim の autocomplpop と neocomplcache »