0

これを扱っている投稿をいくつか見たことがありますが、最善の解決策を決定しようとしています。

意味的には、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の方法はありますか? ほとんどそこにあるような気がします...

4

1 に答える 1

0

これを行う方法は次のとおりです。

class Client < ActiveRecord::Base
  belongs_to :survey, :polymorphic => true
end

module Survey
  def self.included(base)
    base.has_one :client, :as => :survey
  end

  def utility_method
     self.do_some_stuff
  end
end

Type1Survey < ActiveRecord::Base
  include Survey

  def method_only_applicable_to_this_type
    # do stuff
  end
end

Type2Survey < ActiveRecord::Base
  include Survey
end
于 2012-10-18T15:22:41.507 に答える