条件字符串文字

时间:2014-01-24 08:20:14

标签: ruby-on-rails ruby if-statement conditional-statements

我尝试使用 CSV 文件格式将大量数据插入表格中的特定列。我的代码如下:

代码

def maritalstatus_migration
   filename = "#{RAILS_ROOT}/config/MaritalStatus_Data_Migration_240114.csv"
   file=File.new(filename,"r")
   while (line = file.gets)
      columns = line.split("$")
      employee = Employee.find_by_employeeid(columns[0].to_s.chomp.strip)
      personnel = Personnel.find_by_extid(columns[0].to_s.chomp.strip)
      if employee && personnel
         sheet_marital_status = columns[1].to_s.chomp.strip
         if sheet_marital_status == 'Married' or 'MARRIED'
            personnel.marital_status = 'Married'
         elsif sheet_marital_status == 'Unmarried' or 'UNMARRIED'
            personnel.marital_status = 'Unmarried'
         elsif sheet.marital_status ='Unknown' or 'UNKNOWN'
            personnel.marital_status = 'Unknown'
         else
            personnel.marital_status = columns[1].to_s.chomp.strip
         end
      end
   end
end     

当我在Console中运行我的方法时,我收到警告说:

String literal in condition

指向personnel.marital_status = columns[1].to_s.chomp.strip行,我做错了什么。非常感谢任何建议。

3 个答案:

答案 0 :(得分:1)

对代码进行更正,尤其是在使用OR条件的情况下,应将警告静音

if ['Married','MARRIED'].include?(sheet_marital_status)
personnel.marital_status = 'Married'
elsif ['Unmarried','UNMARRIED'].include?(sheet_marital_status)
personnel.marital_status = 'Unmarried'
elsif ['Unknown','UNKNOWN'].include?(sheet_marital_status)
personnel.marital_status = 'Unknown'
else
personnel.marital_status = columns[1].to_s.chomp.strip
end

因为如果你使用'XXX' or 'xxx',它总是评估为'XXX'。这意味着您只将sheet_marital_status与第一个字符串进行比较。这可能是编译器警告指示的内容。你最好使用Include。

lemme也知道你的发现。

答案 1 :(得分:1)

我使用case声明:

personnel.marital_status = case columns[1].to_s.chomp.strip
                           when 'Married', 'MARRIED'
                             'Married'
                           when 'Unmarried', 'UNMARRIED'
                             'Unmarried'
                           when 'Unknown', 'UNKNOWN'
                             'Unknown'
                           else
                             columns[1].to_s.chomp.strip
                           end

答案 2 :(得分:0)

String literal in condition类的实例作为String运算符的条件传递时,if警告已经过了,例如,x or y,其中{ {1}}是布尔(正确),xy(不正确)。让我们看看导致警告的条件的行为:

String

如您所见,字符串文字条件始终评估为if false or "ww12" p 1 end # warning: string literal in condition 1 => 1 。因此,对于大多数情况,它可以被视为语法错误。

为了解决此问题,只需将true转换为布尔,例如String。对于您的代码,您将获得:

x == 'string'

或优化:

if sheet_marital_status == 'Married' or sheet_marital_status == 'MARRIED'
   ...
end

注意:对于您的情况,最好使用if sheet_marital_status =~ /^married$/i ... end 语句,而不是case/when语句,因为您在树中有同源条件。< / p>