これを扱っている投稿をいくつか見たことがありますが、最善の解決策を決定しようとしています。
意味的には、Survey と 1 対 1 の関係を持つ Client モデルが必要です。さまざまなフィールドを持つさまざまな種類の調査がありますが、それらの間でかなりの量のコードを共有したいと考えています。フィールドが異なるため、調査用に異なるデータベース テーブルが必要です。さまざまな種類のアンケートを検索する必要はありません。Survey の高速な取得と潜在的な熱心な読み込みのために、Client テーブルに外部キーが必要なように感じます。
したがって、理論的には、次のようなポリモーフィックな has_one と多重継承が必要だと思います。
class Client < ActiveRecord::Base
has_one :survey, :polymorphic => true
end
class Survey
# base class of shared code, does not correspond to a db table
def utility_method
end
end
class Type1Survey < ActiveRecord::Base, Survey
belongs_to :client, :as => :survey
end
class Type2Survey < ActiveRecord::Base, Survey
belongs_to :client, :as => :survey
end
# create new entry in type1_surveys table, set survey_id in client table
@client.survey = Type1Survey.create()
@client.survey.nil? # did client fill out a survey?
@client.survey.utility_method # access method of base class Survey
@client.survey.type1field # access a field unique to Type1Survey
@client2.survey = Type2Survey.create()
@client2.survey.type2field # access a field unique to Type2Survey
@client2.survey.utility_method
今では、Ruby が多重継承をサポートしておらず、:has_one が :polymorphic をサポートしていないことも知っています。それで、私が得ていることを達成するためのクリーンなRubyの方法はありますか? ほとんどそこにあるような気がします...