Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

スコープまたはクラスメソッドを使用する必要がありますか?

この記事は、Soonsang Hongのおかげで、韓国語でも利用できます!

スコープは、データベースから適切なオブジェクトを取得するための優れた方法です。

app / models / review.rb
class Review < ActiveRecord::Base
  scope :most_recent, -> (limit) { order("created_at desc").limit(limit) }
end

次のようなスコープを使用します:

app / models / homepage_controller.rb
@recent_reviews = Review.most_recent(5)

ただし、そのスコープを呼び出すと、正確に見えます。 Reviewでクラスメソッドを呼び出すようなものです 。代わりに、クラスメソッドとして作成するのは簡単です:

app / models / review.rb
def self.most_recent(limit)
  order("created_at desc").limit(limit)
end
app / controllers / homepage_controller.rb
@recent_reviews = Review.most_recent(5)

では、通常のRubyクラスメソッドを使用できるのに、なぜスコープを使用するのでしょうか? これらを完全に分離しているが同等の概念を頭の中で維持することは価値がありますか?奇妙なバグに遭遇した場合はどうなりますか?これらすべての余分なものが、Railsの学習を難しくしているようなものではありませんか?

いつ クラスメソッドの代わりにスコープを使用するのは理にかなっていますか?

クラスメソッドがすでにあるのにスコープを使用するのはなぜですか?

特定の日付以降に書かれたすべてのレビューを取得したい場合はどうなりますか?ただし、日付が指定されていない場合は、すべてが必要です。 代わりにレビューが返されましたか?

スコープとしては、次のようになります:

app / models / review.rb
scope :created_since, ->(time) { where("reviews.created_at > ?", time) if time.present? }

簡単ですよね?クラスメソッドはどうですか?

app / models / review.rb
def self.created_since(time)
  if time.present?
    where("reviews.created_at > ?", time)
  else
    all
  end
end

少し余分な作業が必要です。スコープはスコープを返すことを好むため、簡単にチェーンできます:

Review.positive.created_since(5.days.ago)

ただし、クラスメソッドを同じように機能させるには、時間がゼロの場合を具体的に処理する必要があります。 それ以外の場合、発信者 有効で連鎖可能なスコープがあるかどうかを判断する必要があります。

常に同じ種類のオブジェクトを返すメソッドは非常に便利です 。エッジケースやエラーについてそれほど心配する必要はありません。使用できるオブジェクトは常に返されると想定できます。

ここでは、nilを気にすることなく、スコープをチェーン化できることを意味します。 戻ってくる値。

常にスコープを取り戻すという仮定を破る方法はまだあります:

app / models / review.rb
scope :broken, -> { "Hello!!!" }
irb(main):001:0> Review.broken.most_recent(5)
NoMethodError: undefined method `most_recent' for "Hello!!!":String

しかし、実際のコードでそれが起こったことは一度もありません。

スコープについて私が最も気に入っているのは、スコープが意図を表現していることです。 。あなたは、あなたのコードを読む次の人に、「このメソッドは連鎖することができ、最終的にはオブジェクトのリストになり、適切なオブジェクトのセットを選択するのに役立ちます」と言っています。これは、ジェネリッククラスのメソッドが言う以上のものです。

スコープの代わりにクラスメソッドを使用する必要があるのはいつですか?

スコープは意図を表すため、シンプルな組み込みスコープ(whereなど)をチェーンするときは常にスコープを使用します およびlimit )より複雑なスコープに 。適切なオブジェクトの束を見つけることが、スコープが設計された目的です。

2つの例外があります:

  1. スコープをプリロードする必要がある場合は、代わりにスコープを関連付けに変換します
  2. 組み込みスコープをより大きなスコープにチェーンする以上のことを行う場合は、クラスメソッドを使用します

スコープロジックが複雑になると、クラスメソッドはそれを配置するのに適切な場所のように感じます。

クラスメソッド内では、Rubyコードとデータベースコードを簡単に組み合わせることができます。 Rubyで記述しやすい並べ替えコードがある場合は、オブジェクトをデフォルトの順序で取得し、sort_byを使用して正しい順序に並べることができます。

または、特に注意が必要な場合は、クラスメソッドが、データベース、Redis、外部APIまたはサービスなどのいくつかの異なる場所からデータを取得する可能性があります。次に、すべてを感じるオブジェクトのコレクションにまとめることができます。 配列に変換されたスコープのようなものです。

それでも、選択、並べ替え、結合、フィルタリングのコードをスコープ内に配置するのは良いことです。次に、クラスメソッド内でスコープを使用します。 最終的に、より明確なクラスメソッドと、アプリ全体で使用できるスコープが得られます。

スコープは、私のお気に入りのRails機能の1つです。 いくつかの強力なことができます。Railsモデルの並べ替えとフィルタリングに関する私の記事を読んで、特に便利なスコープの例を確認してください。

そして、スコープを使用して習得するための非常に簡単な方法があります。小さな、焦点を絞ったアプリ内でスコープを操作します。 PracticingRailsの無料サンプルの章でその方法を説明します。 ぜひチェックしてください!


  1. Double VPN とは何か、使用すべきか

    オンライン プライバシーとセキュリティに関連する増大する問題に対処するために、多数のセキュリティ ソリューションとインフラストラクチャが構築されています。これには主に VPN が含まれます。 とダブル VPN 最適な VPN ソリューションについては既に説明しました およびその機能の詳細。 (ベスト VPN カテゴリをチェックして、いくつかの高度な機能について学びたい場合) Windows 10、8、7 PC に最適な 13 の VPN Mac 向けの 12 のベスト無料 VPN Linux に最適な VPN Android 向け VPN アプリ トップ 10 iPad

  2. Firefox を使用すべき理由

    私は Firefox を約 15 年間使用してきました。その間、私はそれが美しいプロジェクトに成長し、素晴らしい拡張機能の世界になり、競合他社と同じようにゆっくりと縮小して衰退し、そもそも持っていたコアの利点を失うのを見てきました.それにもかかわらず、それは私の主要なブラウザであり続けています。そして、あなたが私に尋ねているのなら、そうすべきです - それはあなたのものでもあるはずです。 この記事では、その理由を説明します。メモリ消費量、ブラウザの起動に 3 ミリ秒余分にかかること、電話でのアプリケーションの見栄えなど、日常的な問題を超えています。それは、選択、選択の自由、そして競争の決定的