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 }) }, } } })() アクティブレコード照会インターフェース - The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2020-06-03
ソフトウェア開発

アクティブレコード照会インターフェース

マルタ・ポレキュ

パフォーマンスは、ウェブアプリケーションを開発する際に考慮すべき最も重要な側面の1つです。データベースからどのようにデータが取得されるかを分析することは、機能強化を検討する際の良い出発点となります。この記事では、集計関数を使ったり、データベースレベルでデータをフィルタリングしたりすることで、パフォーマンスを改善する方法を紹介します。

まず、いくつかの背景を説明しよう。

この記事は、かつて私が実際に直面した問題から着想を得ている。この問題に対処することで、私は多くのことを学んだ。例題は良い学習リソースだと思う。今回は、Active Recordのクエリーメソッドを使った例をいくつか紹介したいと思います。

ドメイン特有の詳細を紹介しないために、あるライブラリーのサンプル・アプリケーションを使って例を説明しよう。下の図に示すように、すべてとてもシンプルです。著者、本、ユーザー、レンタルの4つのテーブルがあります。一人のユーザが多くの本を借りることができ、一冊の本を多くのユーザが借りることができるので、多対多の関係をモデル化するために結合テーブルが必要です。私たちの場合はrentalsテーブルです。また、借りた日付と返した日付という追加情報も格納します。一人の著者は、その名前に多くの本を割り当てることができます。また、本にはジャンルを定義する属性があります。

ユーザー読書統計

タスクは、一人のユーザーの統計を作成し、各ジャンルから何冊の本が借りられたかを知ることでした。最初に考えたのは、そのユーザーが借りた本をすべて取得し、ジャンルごとにグループ分けして、各ジャンルにリストではなく冊数を割り当てるマッピングを行うことでした。そうすれば、各ジャンルにはリストの代わりに冊数が割り当てられます:

ハッシュ[Book.joins(:rentals).where(rentals: { user: user }).group_by(&:ジャンル).map { |ジャンル, books| [ジャンル, books.size] }].

この方法は機能し、見た目もすっきりしていますが、Active Recordのクエリーメソッドが提供するすべての可能性を使っているわけではありません。クエリメソッドのおかげで、生のSQLを直接使うことなく、データベースレベルでデータをフィルタリングしたり集約したりすることができます。 コード.dbレベルで運営することで、効率も向上する。

上の例では、Rubyのgroupの代わりにgroupメソッドを使うことができる。メソッドによってGROUPBY 節を tSQL クエリに追加する。さらに、マッピングとサイズメソッドは、カウント集約関数に置き換えることができます。最終的に、以下のようなクエリが出来上がります:

Book.joins(:rentals).where(rentals: { user: user }).group(:genre).count(:books)

もっとシンプルに見える!

その他の有用な例

以下に、私が知る価値のあると思うクエリーメソッドの他の使い方をいくつか紹介する。

非アクティブ・ユーザーへの招待

タスク本を借りたことがないか、1年以上前に借りたことがあるユーザーをフィルタリングする。

関連するレンタルを含めてすべてのユーザーをフェッチし、selectメソッドを使ってフィルターをかけることができる。

User.includes(:rentals).select do |user|.
 user.rentals.empty?|user| user.rentals.none?{ |rental| rental.start_date >= Date.today - 1.year }.
end 

しかしもちろん、すべてをフェッチする必要はない。クエリーメソッドを使えば、dbレベルでフィルタリングすることができる。まず、過去1年間に何冊か本を借りたユーザーを選択し、最終的な選択から除外してみましょう。

サブクエリーはこのようになる:

User.joins(:rentals).where(rentals:{ start_date: (Date.today - 1.year).Date.today })

そして今、すべてをまとめよう:

User.where.not(id:[User.joins(:rentals).where(rentals:{ start_date: (Date.today - 1.year)..Date.today })])

不採用作家

TASK: 借りている本が1冊か0冊の著者を見つける

selectメソッドでこれを行うのは非常に簡単だが、繰り返しになるが、dbがフィルタリングしてくれるので、このような大きなデータセットを操作する必要はない:

Author.includes(:books).select { |author| author.books.size <= 1 } }.

そして、割り当てられた本がゼロの著者をフィルタリングするのは、素早く簡単だ:

Author.left_joins(:books).where(books: { id: nil })

left_joins(および外側joins全般)を使用する際に1つ覚えておくべきことがあります。左のテーブル(ここでは著者)にレコードがあり、右のテーブル(ここでは書籍)に対応するレコードがない場合、結果的に右のテーブルのカラムにはnil値が入力されます。

システムに1冊の本が割り当てられている著者も必要なので、さらにいくつかの操作が必要です。グループ化、カウント、条件の追加が必要です。以下はそのまとめ方です:

Author.left_joins(:books).group(:id).having("count(* <= ?", 1)

条件は集計関数の後に来るので、WHERE句の代わりにHAVING句を使って指定しなければならない。

アプリケーションのパフォーマンスについて考えるとき、Active Recordのクエリーメソッドはチェックする価値があります。コードを単純化し、より速く動作させることができます。共有された例が、クエリーメソッドが提供する可能性を探るのに役立つことを願っています。

続きを読む

– 新しい現実の時。リモートワークの時代が始まって1カ月

– Railsアプリで一般的なJSフレームワークを使用する必要がありますか?Stimulus.jsが代替になるかもしれません。

– ウェブアプリ開発:なぜRuby on 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