2016-05-14 15 views
-2

Ich versuche, einen Wert aus einem Dropdown zu ersetzen, wenn mehrere Bedingungen erfüllt sind. Ich versuche das mit der gsub-Methode zu tun.ruby ​​gsub mit Bedingung

enter image description here

Szenario 1: Wenn aktuell ausgewählter Wert 9.3.9 ist dann Wert 9.4.1 soll nicht

Szenario 2 zur Verfügung: wenn aktuell ausgewählter Wert ist 9.3.10 dann Wert 9.4.1 und 9.4.4 sollte nicht verfügbar sein

Entschuldigung, dass das Code-Snippet nicht enthalten ist. Unten ist die Methode, die ich verwende, um meine RDS-Instanzen zu erhalten. Ich verwende bereits gsub, um zu überprüfen, ob die aktuelle Version 9.3 ist und ein Upgrade auf 9.4 verhindert. Ich möchte das auf das obige Szenario ändern.

def available_engine_versions(instance) 
     if instance.engine == RdsGeneric::RDS_TYPE_MYSQL 
     # This custom override for certain MySQL cases suppresses the option to upgrade to 5.6 from 5.5. 
     # Amazon cannot do direct updates from MySQL 5.5 to MySQL 5.6 for DBs created before 4/23/2014. 
     # instance.instance.created_at -> Uses Amazon's date of creation, not the one stored by ActiveRecord 
     if instance.nil? || instance.engine_version.start_with?('5.6.') || instance.instance.nil? || instance.instance.created_at >= Time.parse('2014-04-23') 
      RdsConfiguration::rds_configurations[RdsGeneric::RDS_TYPE_MYSQL][:engine_versions] 
     else 
      RdsConfiguration::rds_configurations[RdsGeneric::RDS_TYPE_MYSQL][:engine_versions].select{ |type| type.to_f <= 5.5 } 
     end 
     elsif instance.engine == RdsGeneric::RDS_TYPE_POSTGRES 
     RdsConfiguration::rds_configurations[RdsGeneric::RDS_TYPE_POSTGRES][:engine_versions].select{ |type| type.gsub(/(\d+\.\d+).*?$/,"\\1") == instance.engine_version.gsub(/(\d+\.\d+).*?$/,"\\1") } # no upgrades from e.g. 9.3.x to 9.4.y 
     else 
     RdsConfiguration::rds_configurations[instance.engine][:engine_versions] 
     end 
    end 
+1

Wie speichern Sie die Liste der Versionen und die ausgewählte Version? muss Code sehen, um eine Antwort zu geben; z. B. ist gsub ein String-Operator, aber ich würde erwarten, dass Sie tatsächlich ein Array überprüfen –

+0

Dies scheint wie ein JavaScript-Problem. Bist du sicher, dass du Ruby brauchst? – tadman

+1

Sie möchten diese "versionabetically" wahrscheinlich lieber als in der Standardsortierreihenfolge sortieren: 'sort_by {| v | v.split.collect (&: to_i)} ' – tadman

Antwort

1

Ich glaube, das funktioniert:

selected_value = instance.engine_version.gsub(/(\d+\.\d+\.\d+).*?$/,"\\1") 
RdsConfiguration::rds_configurations[RdsGeneric::RDS_TYPE_POSTGRES][:engine_versions].reject do |type| 
    dropdown_entry = type.gsub(/(\d+\.\d+\.\d+).*?$/,"\\1") 

    (dropdown_entry == "9.4.1" && selected_value == "9.3.9") || (["9.4.1", "9.4.4"].include?(dropdown_entry) && selected_value == "9.3.10") 
end 

Hinweis

, die ich select- reject geändert.

Zu wissen, wie die Daten aussehen, würde viel helfen. Sie brauchen die gsub jetzt überhaupt nicht.

+0

Die Daten sind nur Versionsnummern, die über die API von aws abgerufen werden, so dass das Format konsistent ist, z. 9.3.x usw. gsub wurde verwendet, um die neueren Versionen (9.4.x usw.) der Engine-Optionen zu verbergen, wenn die Version 9.3 gerade verwendet wurde. Ich möchte immer noch das Datenformat anpassen, wenn möglich. Aber du hast Recht, vielleicht ist Gsub übertrieben. Ich würde gerne Ihren Vorschlag hören. – user1576738

+0

Ich weiß, Sie können einfach die gsub entfernen und einen direkten Vergleich machen, aber ich möchte sicherstellen, dass das Format konsistent ist (zumindest von meinem Ende). – user1576738

+0

BTW, danke für deinen Vorschlag darüber hat funktioniert. ;-) – user1576738