単一テーブルの継承以外に、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