diff --git a/app/models/connection.rb b/app/models/connection.rb index 018337ab9..067f33a92 100644 --- a/app/models/connection.rb +++ b/app/models/connection.rb @@ -3,4 +3,26 @@ class Connection < ApplicationRecord belongs_to :to, class_name: 'MyModule', foreign_key: 'input_id', inverse_of: :inputs belongs_to :from, class_name: 'MyModule', foreign_key: 'output_id', inverse_of: :outputs + + validate :ensure_non_cyclical + + private + + def ensure_non_cyclical + connections = Connection.where( + input_id: to.experiment.my_modules.select(:id) + ).pluck(:input_id, :output_id).to_h + + visited_nodes = [output_id] + + current_input_id = output_id + + while (current_input_id = connections[current_input_id]) + if current_input_id == input_id || visited_nodes.include?(current_input_id) + errors.add(:output_id, :creates_cycle) and return + end + + visited_nodes.push(current_input_id) + end + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 3dc6ef7e7..31657becc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -163,6 +163,10 @@ en: disabled: 'Webhooks are disabled' url: not_valid: 'Not valid URL' + connection: + attributes: + output_id: + creates_cycle: "mustn't create cycle" helpers: label: