diff options
Diffstat (limited to 'app/models/ml')
-rw-r--r-- | app/models/ml/experiment.rb | 3 | ||||
-rw-r--r-- | app/models/ml/model_metadata.rb | 2 | ||||
-rw-r--r-- | app/models/ml/model_version.rb | 13 | ||||
-rw-r--r-- | app/models/ml/model_version_metadata.rb | 14 |
4 files changed, 31 insertions, 1 deletions
diff --git a/app/models/ml/experiment.rb b/app/models/ml/experiment.rb index ad6c6b7b3bf..456c23df0e0 100644 --- a/app/models/ml/experiment.rb +++ b/app/models/ml/experiment.rb @@ -3,6 +3,7 @@ module Ml class Experiment < ApplicationRecord include AtomicInternalId + include Sortable PACKAGE_PREFIX = 'ml_experiment_' @@ -15,6 +16,8 @@ module Ml has_many :candidates, class_name: 'Ml::Candidate' has_many :metadata, class_name: 'Ml::ExperimentMetadata' + scope :including_project, -> { includes(:project) } + scope :by_project, ->(project) { where(project: project) } scope :with_candidate_count, -> { left_outer_joins(:candidates) .select("ml_experiments.*, count(ml_candidates.id) as candidate_count") diff --git a/app/models/ml/model_metadata.rb b/app/models/ml/model_metadata.rb index 9c4273c629c..9695621e47d 100644 --- a/app/models/ml/model_metadata.rb +++ b/app/models/ml/model_metadata.rb @@ -3,7 +3,7 @@ module Ml class ModelMetadata < ApplicationRecord validates :name, - length: { maximum: 250 }, + length: { maximum: 255 }, presence: true, uniqueness: { scope: :model, message: ->(metadata, _) { "'#{metadata.name}' already taken" } } validates :value, length: { maximum: 5000 }, presence: true diff --git a/app/models/ml/model_version.rb b/app/models/ml/model_version.rb index 58da57f27d6..1b3313c803a 100644 --- a/app/models/ml/model_version.rb +++ b/app/models/ml/model_version.rb @@ -21,12 +21,25 @@ module Ml belongs_to :project belongs_to :package, class_name: 'Packages::MlModel::Package', optional: true has_one :candidate, class_name: 'Ml::Candidate' + has_many :metadata, class_name: 'Ml::ModelVersionMetadata' delegate :name, to: :model scope :order_by_model_id_id_desc, -> { order('model_id, id DESC') } scope :latest_by_model, -> { order_by_model_id_id_desc.select('DISTINCT ON (model_id) *') } + def add_metadata(metadata_key_value) + return unless metadata_key_value.present? + + metadata_key_value.each do |entry| + metadata.create!( + project_id: project_id, + name: entry[:key], + value: entry[:value] + ) + end + end + class << self def find_or_create!(model, version, package, description) create_with(package: package, description: description) diff --git a/app/models/ml/model_version_metadata.rb b/app/models/ml/model_version_metadata.rb new file mode 100644 index 00000000000..61810786091 --- /dev/null +++ b/app/models/ml/model_version_metadata.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Ml + class ModelVersionMetadata < ApplicationRecord + validates :name, + length: { maximum: 255 }, + presence: true, + uniqueness: { scope: :model_version, message: ->(metadata, _) { "'#{metadata.name}' already taken" } } + validates :value, length: { maximum: 5000 }, presence: true + + belongs_to :project, optional: false + belongs_to :model_version, class_name: 'Ml::ModelVersion', optional: false + end +end |