18415


railsのActiveRecordのメソッドですが様々あります。

[ActiveRecord::FinderMethods](http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-
i-find)  
[ActiveRecord::Calculations](http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-
i-pluck)

さて、戻ってくる型ですが  
**ブーリアン** であったり、  
**ActiveRecord::Relation（正確にはActiveRecord::Relationを継承したモデル）** であったり、  
`[ モデル, モデル ... ]`といった **モデルを持つArray** であったり、  
単に **モデル1つ** であったり、  
`pluck`のように **モデルを持たないArray** であったり様々です。  
  

## まとめると（間違いがあるかもしれませんが）

以下推測ですがまとめると

  * ブーリアンを返す -> メソッド名末尾?
  * ActiveRecord::Relationを返す -> SQLにも同名の命令がある
  * モデル単体を返す -> find, find_*
  * モデルの配列を返す -> find, find_*
  * 単に配列を返す -> pluckなど

と思っているのですが、ドキュメントを見ても明確に明示されているものであったりそうでなかったりして結構キツイです。
都度、実行してみて引数に与えた内容と返ってくるものから暗記しようと思えば可能かもしれませんが...
何か覚え方やここを見ればよいといったような指標はないでしょうか？


CC BY-SA 3.0
2015-11-03T04:54:41.927
18348
2015-11-05T03:11:43.837
2015-11-03T23:55:03.373
85
9008
question
ruby-on-rails rails-activerecord
ActiveRecordのメソッド名と戻り値の型の対応関係に何かルールはありますか？


残念ながらありません。ActiveRecordのバージョンによって、同じmethodでも型が変わった例さえあります。Rubyはduck
typingなのであまり型を気にしない方が良いでしょう。型をcompilerが保証してくれない代わりにunit
testを多めに書くのがruby流かと思います。


CC BY-SA 3.0
2015-11-04T17:37:38.153
18408
2015-11-04T17:37:38.153
226
18348
answer


この手の質問はベストアンサーが決めづらいのでスタック・オーバーフロー的にはNGかもしれませんが、とりあえず回答します。

僕がRailsを始めた頃はRails3レシピブックをよく参照していました。

[Amazon.co.jp： Rails3レシピブック 190の技: 高橋 征義, 松田 明, 諸橋 恭介:
本](http://www.amazon.co.jp/Rails3%E3%83%AC%E3%82%B7%E3%83%94%E3%83%96%E3%83%83%E3%82%AF-190%E3%81%AE%E6%8A%80-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797363827)

クエリ周りの処理も詳しく書いてあるので、「これを一通り読む＆困ったときに参照する」であまり苦労せずに覚えられた気がします。  
ただし、Rails 4版が出ていないので、現行のRailsとは微妙に仕様が異なる部分があるかもしれません。

あと、100%網羅できるわけではありませんが、僕の中ではざっくりと次のように覚えています。

  * find = 1件だけモデルを返す。見つからないと例外が発生する。（僕は複数idを渡す使い方はしてない）
  * find_by(xxx: ), find_by_xxx = 1件だけモデルを返す。見つからないとnilが返る
  * where, all = モデルの配列が返る。ただし値が読み出されるまでDBにクエリを投げない。

他にも多くのメソッドや組み合わせのバリエーションがあるので、「これが法則だ」というのは一つに決めづらいですね。  
とりあえず、戻り値が1件だけか、配列か、ということだけを最低限意識していれば、Railsを開発する上でそれほど大きく困ったことはないように思います。


CC BY-SA 3.0
2015-11-04T23:36:04.580
18411
2015-11-04T23:36:04.580
85
18348
answer


> 何か覚え方やここを見ればよいといったような指標はないでしょうか？

Railsでよく分からないときはRailsガイドを見るようにしています。  
気をつけないといけない点が書いていることが多いです。

### 参考

原文: <http://guides.rubyonrails.org/active_record_querying.html>  
日本語訳: <http://railsguides.jp/active_record_querying.html>

## 捕捉

以下それぞれの推測について、捕捉です。

### ブーリアンを返す -> メソッド名末尾?

真偽値を返すメソッドのメソッド名の末尾に`?`をつけることは多いです。  
例えば[serverworksのコーディング規約](https://github.com/serverworks/ruby-style-
guide#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%90%8D)で採用されています  
このようなメソッド名が`?`で終わるメソッドをPredicate Method(述語メソッド)と呼んだりします。

注意したいのはRubyでの真偽値の定義です。

> Ruby では false または nil だけが偽で、それ以外は 0 や空文 字列も含め全て真です。  
>  <http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fcontrol.html>

※実際true/false以外を返していた時期があります

[let AR::FinderMethods#exists? return singletons in all cases closes ·
rails/rails@565c367](https://github.com/rails/rails/commit/565c367d344228211f03d7736de79d1cfff26422)

## ActiveRecord::Relationを返す -> SQLにも同名の命令がある

SQLに同名の命令がない場合も`ActiveRecord::Relation`を返すことがあります。

Railsガイドからの引用です。

> bind  
>  create_with  
>  distinct  
>  eager_load  
>  extending  
>  from  
>  group  
>  having  
>  includes  
>  joins  
>  limit  
>  lock  
>  none  
>  offset  
>  order  
>  preload  
>  readonly  
>  references  
>  reorder  
>  reverse_order  
>  select  
>  uniq  
>  where  
>  上のメソッドは、すべてActiveRecord::Relationのインスタンスを返します。

### モデル単体を返す -> find, find_ _, モデルの配列を返す -> find, find__

これについてもRailsガイドを見ると例と一緒に、単体を返す場合、複数を返す場合が載っています。  
<http://guides.rubyonrails.org/active_record_querying.html#retrieving-a-
single-object>  
<http://railsguides.jp/active_record_querying.html#%E5%8D%98%E4%B8%80%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99>

### 単に配列を返す -> pluckなど

`pluck`はパフォーマンスが必要な場合に使います。

>
> selectと異なり、pluckはデータベースから受け取った結果を直接Rubyの配列に変換してくれます。そのためのActiveRecordオブジェクトを事前に構成しておく必要はありません。従って、このメソッドは大規模なクエリや使用頻度の高いクエリで使用するとパフォーマンスが向上します  
>  <http://railsguides.jp/active_record_querying.html#pluck>  
>  <http://guides.rubyonrails.org/active_record_querying.html#pluck>


CC BY-SA 3.0
2015-11-05T03:11:43.837
18415
2015-11-05T03:11:43.837
2599
18348
answer