2016-05-14 56 views
-2

如果满足多个条件,我试图从下拉列表中替换一个值。我试图用gsub方法做到这一点。具有条件的ruby gsub

enter image description here

场景1:如果当前选定的值是9.3.9然后值9.4.1不应该可用

场景2: 如果当前选择的值为9.3.10然后值9.4.1和9.4.4不应该可用

对不起,不包括代码段。以下是我用来获取我的RDS实例的方法。我已经使用gsub来检查当前使用的版本是否为9.3,并防止升级到9.4。我想将其改为上面的场景。

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

你如何存储版本列表和选定的版本?需要看一些代码来提供答案;例如,gsub是一个字符串操作符,但我希望你实际上正在检查一个数组 –

+0

这看起来像一个JavaScript问题。你确定你需要Ruby来做到这一点吗? – tadman

+1

您也可能想要将这些“版本化”排序,而不是按默认排序顺序排序:'sort_by {| v | v.split.collect(&:to_i)}' – tadman

回答

1

我相信这将工作:

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 

注意,我改变selectreject

了解数据看起来会有多大帮助。现在你可能根本不需要gsub。

+0

数据只是通过aws API提取的版本号,因此其格式是一致的,例如, 9.3.x等。如果9.3版本当前正在使用,则gsub用于隐藏引擎选项的较新版本(9.4.x等)。如果可能,我仍然希望匹配数据格式。但你是对的,也许gsub是矫枉过正的。我很想听听你的建议。 – user1576738

+0

我知道你可以简单地删除gsub并做一个直接的比较,但我想确保格式是一致的(至少从我的结尾)。 – user1576738

+0

顺便说一句,感谢您的建议,上面的工作。 ;-) – user1576738