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

RailsアプリはRedisとどのように通信する必要がありますか?

Railsアプリを作成しているときに、別のデータストアを使用するとより簡単に解決できる問題が発生する可能性があります。たとえば、サイトの質問に回答するためにユーザーが獲得したポイント数でユーザーをランク付けするリーダーボードがあるとします。 Redisのソート済みセットを使用すると、多くの実装が自動的に行われます。素晴らしい!しかし、Redisと相互作用するコードはどこに配置しますか?

あなたのUser モデルはRedisと通信できます:

class User < ActiveRecord::Base
  def award_points(points)
    Redis.current.zincrby("leaderboard", points, id)
  end
end

しかし今あなたのUser モデルは、ユーザーを代表し、Redisと話し、および責任を負います。 リーダーボードの管理!これにより、User 理解しにくく、テストしにくく、それはあなたが望むものの反対です。

代わりに、RedisリクエストをRedisを使用しているものを表す新しいオブジェクトでラップすることができます 。たとえば、Leaderboardを作成できます Redis通信をラップするクラス。しません ActiveRecord::Baseから継承 、ただし、app/modelsに引き続き存在します ディレクトリ。これは次のようになります:

app / models / Leaderboard.rb
class Leaderboard
  def award_points_to_user(user_id, points)
    Redis.current.zincrby("leaderboard", points, user_id)
  end
end
app / models / user.rb
class User < ActiveRecord::Base
  def award_points(leaderboard, points)
    leaderboard.award_points_to_user(id, points)
  end
end

これらのクラスは両方ともapp/modelsに存在できます 、ただし、ActiveRecordモデルを追加のロジックで汚染することはありません。 Leaderboard クラスはRedisとの通信を管理するため、User クラスは、リーダーボードがどのように実装されているかを気にする必要がなくなりました。これにより、テストも簡単になります。

新しい責任のために新しいクラスを作成し、app/modelsを作成することで、多くのことを得ることができます。 それらを保持するのに最適な場所です。コードを簡単に操作できるようにしながら、機能の実装のために別のサービスに頼ることができるというメリットがあります。

試してみてください

ActiveRecordモデル、コントローラー、またはビューから直接呼び出されるネットワークサービス通信について考えてみてください。そのコードを非ActiveRecordデータモデルに移動してみて、コードが理解しやすくなり、操作し、テストしやすくなるかどうかを確認してください。次に、私にメールを送って、それがどのように進んだかを知らせてください!

覚えておいてください:

コンピュータサイエンスのすべての問題は、別のレベルの間接参照によって解決できます。

—デビッド・ウィーラー

…間接参照の層が多すぎるという問題を除いて。

—ケヴリン・ヘニー


  1. Windows 10でアプリをミュートする方法

    Windows 10 では、すべてのオーディオ デバイスと、インストールした多くのアプリが優れたオーディオ コントロールを備えています。Windows 10 でアプリをミュートする方法を知りたいですか?次に、この記事が役に立ちます。ヘッドフォンのレベルを個別に選択できます。接続すると、Windows 10 によって自動的に変更されます。同様に、ボリューム ミキサーを使用して特定のアプリの音量を調整することもできます。 Windows 10 でアプリをミュートする方法 PCまたはラップトップで同時に実行されている多くのアプリの音量を調整する簡単な手法があります.音量ミキサーは、アプリごと

  2. SwiftUI で GameKit Leaderboard を実装する方法

    この記事では、GameCenter の Leaderboard をアプリ内に実装する理由と方法について説明します。 GameCenter が大幅な復活を遂げている理由 スコアボードなしで iPhone ゲームを作成することもできますが、リーダーボードを使用すると、世界中の人々が互いに競争しているように、ゲームの競争力を高めることができます。 独自のバックエンドを作成して管理する代わりに、GameCenter Leaderboard を使用すると、トラフィックに合わせて無限にスケーリングしたり、認証のためにログイン ページ全体をスキップしたり、画像、名前、同じゲームをプレイしている友達を