0

私が落書きしている Rails 4 アプリのモデルを構築する方法について意見が必要です。アーキテクチャはそれほど難しくないはずですが、私は何時間もぐるぐる回っているので、コミュニティに公開します。

has_many の「フィールド」を持つ「checkin」というモデルがあります。各フィールドには、時間の経過とともに数が増える可能性のあるいくつかのデータ型の 1 つである多くの値を含めることができますが、最初はfloatstring. フィールドがチェックインに追加されると、そのデータ型は変更できません。

体重を減らすためのチェックインを考えてみてくださいweightweight他の人は , をログに記録したいかもしれません%bodyfat. 他のメトリクス用の追加フィールドや、気分を表すテキスト フィールドが必要な場合もあります。

だから私がこれまでに持っているものは次のとおりです:

class Checkin < ActiveRecord::Base
  has_many :fields

class Field < ActiveRecord::Base
  belongs_to :checkin

そして、私はするつもりでした

class DataFloat < ActiveRecord::Base
  belongs_to :field

class DataString < ActiveRecord::Base
  belongs_to :string

スキーマは、今のところ参照のみで単純です。DataFloat にはフロートがあり、DataString には文字列があります (ご想像のとおり)。

次に、( THISActiveRecord::Base.descendantsに従って)のようなものを使用して選択ボックスを作成し、チェックインに追加するときにフィールドを選択できるようにします。

そこにいるすべての MVC 専門家への私の質問は、これがこれを行うための最良の方法であるかどうかです。DataFloat と DataString によって拡張された中央オブジェクト「データ」を使用したほうがよいでしょうか? 私が思いもよらなかった3番目のより良い方法はありますか?

4

1 に答える 1

0

誰か……ビューラー?

私はそれを解決することができましたが、私がやろうとしていたことの正しい用語を見つけるのに長い時間がかかりました. それは基本的に逆の多態的な関連付けです。

Rune Madsen による素晴らしいチュートリアルがあります: https://gist.github.com/runemadsen/1242485

基本的に私はこのようにします:

class Field < ActiveRecord::Base
  has_many :field_datas
  has_many :data_ints, :through => :field_datas, :source => :data_object, :source_type => 'DataInt'
  has_many :data_floats, :through => :field_datas, :source => :data_object, :source_type => 'DataFloat'
   .... etc.....

それから私は:

class FieldData < ActiveRecord::Base
  belongs_to :field
  belongs_to :data_object, :polymorphic => true
end

そして最後に、ID と 1 つの列を持つテーブルである実際のデータ:

class DataInt < ActiveRecord::Base
  has_one :field_data, :as =>:data_object
  has_one :field, :through => :datas

そして、データ型ごとに DataType クラスがあります。

すべてが適切に破棄および作成されるようにするには、おそらく特別なハンドラーを作成する必要があると思いますが、全体的には非常に満足しています。

このようにすることについて誰かが意見を持っているかどうか知りたいです。

于 2013-08-07T19:23:53.057 に答える