2014-01-24 3 views
0

Я пытаюсь вставить большую часть данных в конкретную колонку в моей таблице, используя 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  

Когда я запускаю мой метод в консоли, я получаю предупреждение говоря:

String literal in condition 

указывая на линии personnel.marital_status = columns[1].to_s.chomp.strip, что ж Я делаю неправильный. Все предложения будут очень признательны.

ответ

1

Поправка к коду, особенно когда вы используете или условия должны отключить предупред

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 знаю ваши выводы тоже.

+0

Это отлично! Благодарю. – Pavan

+0

Спасибо за исправление @Pavan –

0

String literal in condition предупреждения shewn вверх, когда вы прошли экземпляр String класса в качестве условия для if оператора, то есть, например, x or y, где x является булева (правильно), и y является String (неправильно) , Давайте посмотрим на поведение при условии, что приводит к предупреждению:

if false or "ww12" 
    p 1 
end 

# warning: string literal in condition 
1 
=> 1 

Как вы можете видеть, строковый литерал условие всегда оценивается в true. Поэтому в большинстве случаев это можно рассматривать как синтаксическую ошибку.

Чтобы исправить это, просто преобразуйте String в boolean, например x == 'string'. И для вашего кода вы получите:

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

или с оптимизациями:

if sheet_marital_status =~ /^married$/i 
    ... 
end 

Примечание: для вашего случая, то это будет лучше всего использовать вас case/when заявление, вместо if-elsif-else заявления, потому что у вас есть гомогенное состояние в дереве.

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 
+0

Спасибо! Прохладный. – Pavan

Смежные вопросы