2

ご挨拶、すべて、

私はRubyonRailsでアプリケーションに取り組んでおり、アプリがアクセスする各ユーザー(Facebook、MySpace、Google、SalesForce、Twitter、WordPressなど)の一連の外部サービスを追跡する必要があります。ユーザーに代わって。一部のサービスでは、(暗号化された)ユーザー名とパスワードを保存する必要があります。一部のサービスでは、OAuthデータ、一部のOAuth2データなどを保存する必要があります。アプリが成長するにつれて、それぞれが独自の認証データのセットを持つ、さらに多くの種類のアカウントをサポートする必要があります。

各ユーザーはアプリケーション内で投稿を作成できます。これらの投稿を取得して外部サービスに送信し、ユーザーに公開します。次に、公開された投稿への応答を追跡します(Twitterでのリツイート、Facebookでのいいね/共有など)。

それで:

class User < ActiveRecord::Base
  has_many :services
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :publishes
end

class Publish < ActiveRecord::Base
  has_one :service
  belongs_to :post
end

class Service < ActiveRecord::Base
  belongs_to :user
  belongs_to :publish
end

私は自分のServiceタイプに単一テーブル継承を使用すること(たとえば、、、、、および単純なハッシュをシリアル化して認証データを保存すること)と、すべてのタイプのサービスが独自のモデルとテーブルである従来の正規化されたスキームを使用することWordpressServiceについて議論しています。ユーザーに関連付けられているすべてのサービスを簡単に繰り返すことができるようにしたいのですが、公開は任意のタイプのサービスに関連付けることができる必要があります(たとえば、公開はWordPress、Facebook、Twitterに送信される場合があります)。 。FacebookServiceTwitterService

従来の正規化されたアプローチを使用して、そのようなモデル関係を実現できますか?それとも、これはまさにSTIが解決することを意図したものですか?

ありがとう。

4

4 に答える 4

2

STI の代わりに、ポリモーフィック アソシエーションを使用できます。

class AccountAuth < AR::Base
  belongs_to :account
  belongs_to :authentication, :polymorphic => true
end
# account_id          :integer
# authentication_id   :integer
# authentication_type :string

module Auth
  #common logic
end

class FacebookAuth < AR::Base
  include Auth
  has_one :account_auth,:as=>:authentication
  has_one :account, :through => :account_auth
end

class Account < AR::Base
  has_many :account_auths
  has_many :authentications, :through => :account_auths
end

これこれがあなたを助けるかもしれません。

于 2011-04-03T11:44:36.583 に答える
2

セットアップが非常に簡単で、すぐに使用できる多くのサービスの認証資格情報の保存を処理するomniauth プラグインを確認することをお勧めします。セットアップ方法を示すレールキャストがいくつかあります。他に何もないとしても、彼らが物を保管する方法を提案する方法を見ることができました.

于 2010-10-23T17:24:03.097 に答える
0

この問題を解決するための「正しい」方法かどうかはまだわかりませんが、別のモデルのすべてhas_manyのサービスのリストを簡単に取得できるように、単一テーブル継承を使用することにしました(ServiceもありますService、私はそれらすべてを取得するために呼び出すことができmodel_instance.servicesます)。

has_many :servicesコードの重複の問題を解決するために、各タイプのサービスと同様に、あらゆるモデルで使用するためのモジュールを作成しました。

module HasServices
  extend ActiveSupport::Concern
  included do
    has_many :services
    has_many :facebook_services
    has_many :twitter_services
    has_many :wordpress_services
  end
end

Serviceまた、そのサブクラスを認識しているため、メニューなどを簡単に作成できます。

class Service < ActiveRecord::Base

  @child_classes = []

  ...

  protected

    def self.inherited(child)
      @child_classes << child
      super
    end

    def self.child_classes
      @child_classes
    end
end
于 2010-09-26T21:10:37.013 に答える
0

何百万人のユーザーを保存し、1 秒あたり何回テーブルにクエリを実行しますか? 一般的に言えば、物理的な設計はそのタイプのストレージに悩まされますが、ハードウェアは多数のアプリケーションの設計の欠陥を克服します。大規模な日付や大量の取引を行っていない場合は、何を考えても問題ありません。

于 2010-09-22T18:20:12.803 に答える