0

私の仕事は、アクティブなレコード クラスを抽象化/継承することです。投稿がタイトル、スラッグ日付などの基本的なスーパーであるブログを作成しています...あなたが見つけると予想されるすべての冗長なもの。

ここで事態が変わります。Post を、オーディオ投稿、ビデオ投稿、画像投稿、バニラ投稿など、他の多くのサブ投稿タイプにサブクラス化したいと考えています。私はあなたがポイントを得ると思います。明らかに、各サブタイプにはそれぞれの属性とメンバーがあります。

  1. サブ投稿タイプごとに名前、スラッグなどを作成する代わりに、基本クラスを継承またはインターフェースするためのベストプラクティスは何ですか? (「私は継承より合成を好む」)

  2. モデルを適切に抽象化する方法を理解したら、次に、Blog.find(1).posts のようなものを言って、すべての投稿タイプの配列を取得するポリモーフィックな方法を見つけたいと思います。

これは、ポリモーフィックな方法ですべての投稿タイプをクエリするのに最適なパフォーマンスではない可能性があることを認識しているため、より良い方法でセゲストしてください。

4

2 に答える 2

1

私も個人的には継承よりも構成を好みますが、ActiveRecord はそうではありません。この場合、ActiveRecord が提供するツールを使用する場合は、Single Table Inheritanceを参照してください。これにより、両方の質問が処理されます。ただし、継承を使用します。

ActiveRecord 以外の orm に切り替えると、継承を介してすべてを行う必要なく、これを行う方法が提供される場合があります。過去に合成を好むDataMapperを使用して成功しましたが、 ActiveRecord ほど機能が満載ではなく、必要なものが提供されない場合があります。

于 2012-06-02T04:55:35.577 に答える
1

単一テーブルの継承以外に、has_one関連付けの使用を検討することもできます。

すべてのサブタイプには、一般的な投稿名、スラッグなどである 1 つの投稿情報があります (投稿情報は多態的にサブタイプに属します)。

このようにして、投稿情報のテーブルとすべてのサブタイプのテーブルができます。

ただし、モデルでは、もう少し処理を行う必要があります。

class PostInfo < ActiveRecord::Base
  belongs_to :post, :polymorphic => true
  # will need these 2 fields: :post_id, :post_type (might be AudioPost, ImagePost, etc)
end

class AudioPost < ActiveRecord::Base
  has_one :post_info, :as => :post

  # you may also want these:
  accept_nested_attributes_for :post_info
  delegate :name, :slug, :posted_at, :to => :post_info
end

したがって、すべての投稿を取得したい場合は、次のようにすることができます。

Blog.find(1).post_infos

post_info.post # => audio_post, image_post, or whatever depending on post_type

を使用したくない場合は.post_infos、次のようにすべての名前を変更することもできます。

class Post < ActiveRecord::Base
  belongs_to :actual_post # actual_post_id, actual_post_type
end

class AudioPost < ActiveRecord::Base
  has_one :post, :as => :actual_post
  accept_nested_attributes_for :post
  delegate :name, :slug, :posted_at, :to => :post
end

これで、次のことができます。

posts = Blog.find(1).posts

actual_post = posts.first.actual_post # => an audio_post instance

actual_post.name # => same as actual_post.post.name, so you do not need the name field in the AudioPost model
于 2012-06-02T06:27:32.590 に答える