我需要一个关于如何为我正在涂鸦的rails 4应用程序构建模型的意见。这个架构不应该太难,但我已经圈了几个小时,所以我会把它扔给社区。
我有一个名为“checkin”的模型,其中包含has_many“fields”。每个字段可以包含多个值,这些值可以是多种数据类型中的一种,可能会随着时间的推移而增加,但对于初学者而言,只有float
和string
。将字段添加到签入后,其数据类型无法更改。
考虑一下因某些人只想记录weight
而减肥的签到。其他人可能想要记录weight
,%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有一个字符串(正如你所期望的那样)
然后我将使用类似ActiveRecord::Base.descendants
a(根据THIS)的内容来创建一个选择框,以便您可以选择将字段添加到签入时的字段。
我对所有那些MVC专家的问题是,这是否是最好的方法。我是否会更好地拥有一个由DataFloat和DataString扩展的中心对象“Data”?有没有第三种更好的方式我没有想过?
答案 0 :(得分: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和一列的表:
class DataInt < ActiveRecord::Base
has_one :field_data, :as =>:data_object
has_one :field, :through => :datas
然后每种数据类型都会有一个DataType类。
我想我可能需要编写特殊的处理程序来确保所有内容都被破坏并正确创建,但总体来说我对它非常满意。
我很想知道是否有人对这样做有意见。