0

我需要一个关于如何为我正在涂鸦的 Rails 4 应用程序构建模型的意见。架构应该不会太难,但我已经转了几个小时,所以我会把它扔给社区。

我有一个名为“checkin”的模型,它有很多“字段”。每个字段都可以有许多值,这些值可以是几种数据类型之一,这些数据类型的数量可能会随着时间的推移而增加,但对于初学者来说只是floatstring。一旦将字段添加到签入中,其数据类型就无法更改。

想想一些人只想登录的减肥签到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.descendantsa 的东西(根据THIS)来创建一个选择框,以便您可以在将字段添加到签入时选择它是什么。

对于所有 MVC 专家,我的问题是这是否是最好的方法。拥有一个由 DataFloat 和 DataString 扩展的中心对象“Data”会更好吗?有没有我没想到的第三种更好的方法?

4

1 回答 1

0

任何人...... bueller?

我设法解决了这个问题,但花了很长时间才找到我想要做的事情的正确术语。它基本上是反向的多态关联。

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 类。

我想我可能需要编写特殊的处理程序来确保一切都被正确地销毁和创建,但总的来说我对它很满意。

我很想知道是否有人对这样做有意见。

于 2013-08-07T19:23:53.057 回答