1

Я пытаюсь добавить максимум и мин колонки для моей модели, на основе разделителей строки из другого столбца:Rails миграция, добавить новый столбец, используя сплит - сплит() не работает

804025|1356906|2246774

Так мин должна быть: 804025, а максимальный должна быть: 2246774

Я использую этот скрипт миграции:

def change 
    add_column :mer14s, :rmax, :int 
    add_column :mer14s, :rmin, :int 
    Mer14.all.each do |mer| 
     nums_a = [] 
     if mer.leading 
      nums_a += mer.leading.split('|').map(&:to_i) 
      puts mer.leading 
      puts nums_a 
     end 
     if mer.lagging 
      nums_a += mer.lagging.split('|').map(&:to_i) 
     end 
     if nums_a.length > 0 
      mer.update_attributes(:rmax => nums_a.max) 
      mer.update_attributes(:rmin => nums_a.min) 
     end 
    end 
    end 

Однако split('|') возвращает только первый элемент.

puts leading 
puts num_a 

Выход:

804025|1356906|2246774 
804025 

Я подтвердил, что он работает в rails console с помощью:

Mer14.all[18].leading.split('|').map(&:to_i)

Выход [1189919, 3219748, 4010566]

Но он не работает в моем файле миграции и не работает в другом месте (например, мои модели). Может ли кто-нибудь сказать мне, почему это?

+0

Где вы определили 'nums_a'? – zishe

+0

Он был определен в первом 'if', поскольку ведущий никогда не должен быть пустым, но я отредактировал код, чтобы иметь дело с случаем, когда' leading' равно null. – Darkstarone

ответ

0

Это работает для меня:

a = "804025|1356906|2246774" 
a.split('|').map(&:to_i).max 
=> 2246774 
a.split('|').map(&:to_i).min 
=> 804025 
+0

Работает в Ruby, но в rails я получаю ошибку 'can not convert Fixnum в Array' – Darkstarone

+0

Это, очевидно, работает, проблема в другом месте. – zishe

+0

В рельсах раскол производит 'Fixnum', а не' Array', что указывает на специфичность рельсов. – Darkstarone

1

По какой-то причине метод split не пользуется, используя строку внутри рельсов. Вместо этого использовали регулярное выражение, так что оригинал:

nums_a += mer.leading.split('|').map(&:to_i)

становится:

nums_a += mer.leading.split(/\|/).map(&:to_i)

+1

рад, что вы поняли это! Извините, я не могу быть более полезным. –

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