Хранение разных форматов данных в Rails динамически определяется администратором - PullRequest
1 голос
/ 28 сентября 2010

Я столкнулся с проблемой, из-за которой я не могу окончательно решить, какие столбцы будет у одной из моих моделей.Вариант использования будет такой:

Администратор создает новый набор данных, он хочет, чтобы пользователи отвечали.В наборе данных администратор определяет несколько точек данных различного формата и единиц измерения.

Я мог бы представить классы похожими на это:

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

В моей голове это кажется довольно динамичным,но все еще довольно легко реализовать.Что меня беспокоит, так это как сделать проверку для каждой модели данных, которая создается?Так как я не могу жестко закодировать проверку в модели?И чтобы сделать его еще более сложным, что, если некоторые точки данных требуют дополнительных проверок, таких как минимальное и максимальное значение?

Заранее спасибо, Джонас

1 Ответ

1 голос
/ 28 сентября 2010

Вам нужно будет перечислить список доступных проверок.

Затем вы можете создать модель и таблицу проверки (и, возможно, таблицу объединения, если вы хотите, чтобы пользователи могли повторно использовать свои проверки - зависит отваши варианты использования):

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

Не уверен, что я 'Вы точно выяснили ваши отношения, но что-то подобное должно дать вам отправную точку.

...