【问题标题】:Rails migration, add new column using split - split() doesn't workRails 迁移,使用 split 添加新列 - split() 不起作用
【发布时间】:2014-08-31 23:20:39
【问题描述】:

我正在尝试根据来自另一列的分隔字符串向我的模型添加一个最大和最小列:

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]

但它在我的迁移文件中不起作用,在其他地方也不起作用(例如我的模型)。谁能告诉我这是为什么?

【问题讨论】:

  • 你在哪里定义nums_a
  • 它在第一个if中定义,因为前导永远不能为空,但我已经编辑了代码来处理leading为空的情况。

标签: ruby-on-rails split rails-activerecord rails-migrations


【解决方案1】:

由于某种原因,split 方法不喜欢在 rails 内使用字符串。而是使用了正则表达式,所以原来的:

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

变成:

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

【讨论】:

  • 很高兴你知道了这一点!抱歉,我不能提供更多帮助。
【解决方案2】:

这对我有用:

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

【讨论】:

  • 在 Ruby 中工作,但在 Rails 中我收到错误 can't convert Fixnum into Array
  • 这显然有效,问题在不同的地方。
  • 在 Rails 中,拆分生成 Fixnum 而不是 Array,这表明它是特定于 rails 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2014-04-08
相关资源
最近更新 更多