window.pipedriveLeadboosterConfig={です。 ベース:'leadbooster-chat.pipedrive.com'、 companyId:11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2、 } ;(function () { var w = window もし (w.LeadBooster) {なら console.warn('LeadBooster already exists') } else { w.LeadBooster = { {. q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 関数 (n) { { this.q.push({ t: 'o', n: n, h: h }) this.q.push({ t: 't', n: n }) }, } } })() Rails APIのシンプルなフィルタ - The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2022-02-23
ソフトウェア開発

Rails APIのシンプルなフィルタ

The Codest

クシシュトフ・ブシェビッチ

シニア Software Engineer

データをフィルタリングするためにrailsコントローラのインスタンス変数を変異させるのを見るたびに腹を立てていませんか?この記事はそんなあなたのためのものです。

フィルター

以前にも見たことがあるだろう:

# app/controllers/api/v1/things_controller.rb

モジュール API
  モジュール V1
    class ThingsController < BaseController
      def index
        Things = Thing.all
        もし params[:size] なら @things = @things.where(size: params[:size])
        params[:name_contains] if @things = @things.where('name ILIKE ?', "%#{params[:name_contains]}%")。

        jsonをレンダリングする:をレンダリングする。
      終了
    終了
  終了
終了

なぜ私はそれを悪いと考えるのか? コード?単にコントローラーを太らせるだけだからだ。
私は、コントローラーからできる限り多くのロジックを抽出し、目的に関連した
ユーティリティやサービスを使用します。この場合、次のような汎用フィルタを実装します。
多くのコントローラで使用できる。

でも待って、まずは現在のコードを分析してみよう。悪くても動くんだけどね。
最初のスコープ(すべて)を通過した場合に制限している。
関連するパラメータが渡されたかどうかをチェックします。それぞれのフィルターについて、パラメータが渡されたかどうか、渡された場合はそのパラメータを実際にチェックする、
フィルタを適用する。もうひとつは、ivarを使う必要がないということだ。
単なる古いローカル変数だ。

わかった。初期スコープを変更するために、何かサービス・オブジェクトを使うことはできないだろうか?
実行はこのようになる:

# app/controllers/api/v1/things_controller.rb

モジュール API
  モジュール V1
    class ThingsController < BaseController
      def index
        scope = Thing.all
        things = Things::IndexFilter.new.call(scope, params)

        json をレンダリングする: things
      終了
    終了
  終了
終了

見た目はかなり良くなったが、もちろんまだフィルターを実装しなければならない。
コールのシグネチャはすべてのリソースで同じであることに注意。
このタスクのための汎用クラス。

# app/services/generic/index_filter.rb

モジュール Generic
  クラス IndexFilter
    EMPTY_HASH = {}.freeze

    def self.filters
      EMPTY_HASH
    終了

    def call(scope, params)
      apply_filters!(self.class.filters.keys, scope, params)
    end

    プライベート

    def apply_filters!(filter_keys, scope, params)
      filter_keys.inject(scope.dup) do |current_scope, filter_key|.
        apply_filter!(filter_key, current_scope, params)
      終了
    終了

    def apply_filter!(filter_key, scope, params)
      filter = fetch_filter(filter_key)
      apply_filter?(filter, params) でない限り、スコープを返す。

      filter[:apply].call(scope, params)
    終了

    def apply_filter?(filter, params)
      filter[:apply?].call(params)
    end

    def fetch_filter(filter_key)
      self.class.filters.fetch(filter_key) { raise ArgumentError, 'unknown filter' }.
    end
  end
終了

複雑に見える?そんなことはありません。 #apply_filters!.
最初のスコープの複製を取り、各フィルターを適用する。

スコープを適用するということは、最初のスコープの複製を変異させるということだ。
そして、フィルターがハッシュとして実装されることを期待している。 self.filters 方法
子クラスのやってみよう。

# app/services/things/index_filter.rb

モジュール Things
  class IndexFilter (scope, params) { { scope.where(size: params[:size])
          scope.where(size: params[:size])
        }
      }.freeze、
      name_contains_filter:{
        apply?: ->(params) { { params[:name_contains].is_a?
          params[:name_contains].is_a?(String)
        },
        を適用します:->(スコープ, パラメータ) { { スコープ.where('name ILIKE ?', "%X")
          scope.where('name ILIKE ?', "%#{params[:name_contains]}%")
        }
      }.freeze
    }.freeze

    def self.filters
      フィルター
    終了
  終了
終了

以上だ!より多くのコードを書きましたが、単純なフィルターは同じように見えます。
すべてのリソースのための方法です。私たちは、責任あるコードからコントローラーをクリーンアップしました。
フィルタリングのための「特別な」クラスが提供された。
明確な規約。

Ruby開発者オファー

続きを読む

Rubyソフトウェア開発の長所と短所

レールおよびその他の輸送手段

TMUX、Vim、Fzf + RipgrepによるRails開発

関連記事

ソフトウェア開発

将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察

The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...

ザ・コデスト
ソフトウェア開発

ラトビアを拠点とするソフトウェア開発企業トップ10社

ラトビアのトップソフトウェア開発企業とその革新的なソリューションについて、最新記事でご紹介します。ラトビアの技術リーダーたちがあなたのビジネスをどのように向上させるかをご覧ください。

thecodest
エンタープライズ&スケールアップ・ソリューション

Javaソフトウェア開発の要点:アウトソーシングを成功させるためのガイド

outsourcingのJavaソフトウェア開発を成功させるために不可欠なこのガイドを読んで、The Codestで効率性を高め、専門知識にアクセスし、プロジェクトを成功に導きましょう。

thecodest
ソフトウェア開発

ポーランドにおけるアウトソーシングの究極ガイド

ポーランドのoutsourcingの急増は、経済、教育、技術の進歩がITの成長とビジネス・フレンドリーな環境を促進していることによる。

ザ・コデスト
エンタープライズ&スケールアップ・ソリューション

IT監査ツール&テクニック完全ガイド

IT監査は、安全かつ効率的で、コンプライアンスに準拠したシステムを保証します。その重要性については、記事全文をお読みください。

The Codest
ヤクブ・ヤクボヴィッチ CTO & 共同創設者

ナレッジベースを購読して、IT部門の専門知識を常に最新の状態に保ちましょう。

    会社概要

    The Codest - ポーランドに技術拠点を持つ国際的なソフトウェア開発会社。

    イギリス - 本社

    • オフィス 303B, 182-184 High Street North E6 2JA
      イギリス、ロンドン

    ポーランド - ローカル・テック・ハブ

    • ファブリチュナ・オフィスパーク、アレハ
      ポコジュ18、31-564クラクフ
    • ブレイン・エンバシー, コンストルクトースカ
      11, 02-673 Warsaw, Poland

      The Codest

    • ホーム
    • 会社概要
    • サービス
    • Case Studies
    • ノウハウ
    • 採用情報
    • 辞書

      サービス

    • アドバイザリー
    • ソフトウェア開発
    • バックエンド開発
    • フロントエンド開発
    • Staff Augmentation
    • バックエンド開発者
    • クラウドエンジニア
    • データエンジニア
    • その他
    • QAエンジニア

      リソース

    • 外部ソフトウェア開発パートナーとの協力に関する事実と神話
    • 米国から欧州へ:アメリカの新興企業がヨーロッパへの移転を決断する理由
    • テックオフショア開発ハブの比較:テックオフショア ヨーロッパ(ポーランド)、ASEAN(フィリピン)、ユーラシア(トルコ)
    • CTOとCIOの課題は?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • ウェブサイト利用規約

    著作権 © 2025 by The Codest。無断複写・転載を禁じます。

    jaJapanese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek jaJapanese