

すみません、細かい質問で申し訳ないです。

以下のようなgetterがあるとします。

[code]

    def users
      @users ||= User.where(foo: bar)
    end
    
[/code]

上記の問題は、usersという名前からモデルの配列を連想しますが、  
実際は`ActiveRecord::Relation`を返すことです。

なので以下のような命名にしたほうが正しいのかなと思いました。

[code]

    def user_relation
      @user_relation ||= User.where(foo: bar)
    end
    
[/code]

みなさんはどちらが適切だと思いますか？


CC BY-SA 4.0
2022-03-30T02:49:39.127
88095
2022-06-12T03:51:52.107
40650
question
ruby-on-rails
ActiveRecord::Relationをかえすgetterの命名


いろいろおかしいです。

>
[code]

>     def users
>       @users ||= User.where(foo: bar)
>     end
>  
[/code]

このコードは認識の通り"ActiveRecord::Relationを返す"コードです。よって、メモ化する意味はありません。

[code]

    def users
      User.where(foo: bar)
    end
    
[/code]

あらかじめ検索条件を定義する手法として`scope`が用意されています。

[code]

    scope :users -> { where(foo: bar) }
    
[/code]

こう変形するとコード的にはActiveRecord::Relationを返すのは自明なので、「usersという名前からモデルの配列を連想」はしません。scaffoldでも

@users = User.all

みたいなコードが生成されますがこれも@usersはActiveRecord::Relationになります。

(だいたいRailsで「モデルの配列」が出てくるのはたいてい良くない兆候です)

さて、

[code]

        scope :users -> { where(foo: bar) }
    
[/code]

というのはあらかじめ検索条件を定義する手法な訳ですが、名前が`users`だろうと`users_relation`だろうと検索条件がなんなのか全くわかりません。

ということで、「Rails的なコード」について不慣れなのが違和感の原因なのかなと思いました。


CC BY-SA 4.0
2022-04-01T14:45:01.720
88135
2022-04-01T14:45:01.720
5793
88095
answer


そもそも「複数形の名前だけのメソッドは必ず配列を返す」という規則をRailsに適用すること自体が難しいです。Railsが自動生成するメソッドなどでも、複数形の名前だけのメソッドは常に配列を返すとはなっていません。むしろ、データベースから取得した情報を元にモデルを返すようなメソッドは、`ActiveRecord::Relation`(またはそのサブクラス)を返す場合が多いです。たとえば、`User`を1対多で関連付けるために`has_many
:users`と設定した場合に自動生成される`users`メソッドの返り値は`ActiveRecord::Relation`のサブクラスである`User::ActiveRecord_Associations_CollectionProxy`です。これは配列ではありませんが、`Enumerable`もincludeされているため、配列のように扱う事ができます。これに対して、「`ActiveRecord::Relation`を返すからモデルの複数形の名前だけのメソッドはおかしい」と考えることは、Railsの命名規則に対する設計思想とあっていないことになります。

なお、Rubyでは、「複数のオブジェクトを返す」と言った場合に、Enumerableをincludeした何かであれば、十分であると考えられます。本当の配列(Array)が必要であれば、`to_a`を付けるだけでいいからです。


CC BY-SA 4.0
2022-06-12T03:51:52.107
89344
2022-06-12T03:51:52.107
7347
88095
answer