質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2208閲覧

ActiveRecordのscope について

axax90

総合スコア120

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2015/04/21 16:31

ActiveRecordのscope について聞きたいです。

class User < ActiveRecord::Base

.
.
scope :id_desu, -> (id) { find_by (id: id) }
.
.

end

scopeを書いて、1件もヒットしなかったとき、
全件のActiveRecord::Relationの配列がとれるんですけど、こんな感じでしたでしょうか?

とれなかったら、nil とかでいい気がするんですが。

存在する値
User.id_desu(1)
=> #<User id: 1, name: "山田"

存在しない値
User.id_desu(100)
=> #<ActiveRecord::Relation [ #<User id: 1, name: "山田" ...
#<User id: 2, name: "田中" ...
#<User id: 3, name: "吉田" ...
.
.
#<User id: 10, name: "松本" ...]>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なぜ変な振る舞いになるのかは説明できませんが、
scopewhereのような戻り値が複数になるような利用の仕方を想定しているので、想定外の振る舞いをしているのだと思います。


追記:

一時ソースでなくて申し訳ないのですが

スコープの中で発行されたクエリがnilになる場合は、.allを返すように設計されているので、スコープの返り値を気にせずチェーンを繋げることができます。

http://kotatu.org/blog/2014/10/11/why-should-use-scopes-over-class-methods/

だそうです。

投稿2015/04/21 23:11

編集2015/04/21 23:16
hello-world

総合スコア1342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

axax90

2015/04/22 03:46

なるほど、そういうことなんですね! 参考になりました。ありがとうございました! 1件だけ欲しい時は、↓みたいにするってことですね! class User < ActiveRecord::Base . . scope :id_desu, -> (id) { where (id: id) } . . end User.id_desu(12).first
hello-world

2015/04/22 03:49

一件だけの場合は、関数にするのが一般的だと思います。 class User < AR  def self.id_desu(id)   find_by (id: id)  end end user = User.id_desu(12)
axax90

2015/04/22 03:54

おお、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問