1

我面临一个问题,即我无法永久决定我的模型之一将具有哪些列。一个用例是这样的:

管理员创建了一个新数据集,他希望用户回答。在数据集中,管理员定义了几个不同格式和单位的数据点。

我可以想象这些类看起来类似于:

class Dataset < ActiveRecord::Base
 has_many :measurements
 has_many :profiles, :through => :measurements
 has_many :datapoints, :through => :dataset_datapoint
end

# Join table
class Dataset_datapoint < ActiveRecord::Base
 belongs_to :dataset
 belongs_to :datapoint
end

class Datapoint < ActiveRecord::Base
 has_many :dataset, :through => :dataset_datapoint
 has_many :data
 # create_table "datapoints" do |t|
 # t.string :name
 # t.string :format  # e.g. string, decimal etc.
 # t.string :unit # e.g. CM, pounds etc.
end

class Data < ActiveRecord::Base
 belongs_to :datapoint
 # create_table "data" do |t|
 # t.integer :datapoint_id
 # t.string :value # This column could be anything from string to decimal
end

在我看来,这似乎很动态,但仍然很容易实现。我担心的是如何对创建的每个数据模型进行验证?由于我无法对模型中的验证进行硬编码?更复杂的是,如果某些数据点需要额外的验证,例如最小值和最大值怎么办?

在此先感谢,乔纳斯

4

1 回答 1

1

您必须枚举可用验证的列表。

然后您可以创建一个验证模型和表(如果您希望用户能够重用他们的验证,也可以创建一个连接表 - 取决于您的用例):

class Validation < ActiveRecord::Base
  belongs_to :dataset
  # create_table 'validations' do |t|
  # t.references :dataset
  # t.string :type
  # ... and columns for each restriction you could apply, ie:
  # t.integer :max_value      
  # t.integer :min_value
  # t.string :regexp
  # ...etc...
end

然后,在您的data模型中,添加一个before_save过滤器来调用您的自定义验证方法:

class Data < ActiveRecord::Base
  belongs_to :datapoint
  has_many :validations, :through => :datapoint
  before_save :custom_validation

private
  def custom_validation
    validations.each do |validation|
      if validation.type == 'integer_range'
        unless value < validation.max_value and value > validation.min_value
          # return false, or add an error on the value attribute, or whatever
        end
      # More validations here - use a case statement probably
    end
  end
end

不确定我是否已经完全弄清楚了你的关系,但类似的事情应该给你一个起点。

于 2010-09-28T11:07:29.077 回答