【问题标题】:Column_names being deleted when deleting from array从数组中删除时删除 Column_names
【发布时间】:2012-10-01 16:02:43
【问题描述】:

如果我这样做:

name_array = Model.column_names
name_array.delete_if {|name| ["id","created_at","updated_at"].include?(name)}
pp Model.column_names

Model.column_names 命令将返回一个没有idcreated_atupdated_at 列名的数组。我的假设是 name_array 将删除名称而不是 Model.column_names 数组。

Rails 3.0.13 红宝石 1.9.3

【问题讨论】:

  • 这里有一个类似的问题和答案:stackoverflow.com/questions/2635156/…
  • iouri 您的评论正是我所需要的。如果你想让它成为我会接受的答案。
  • 如果您接受该链接的答案,我可以接受。

标签: ruby-on-rails ruby


【解决方案1】:

查看Array documentation 获取delete_if

删除块计算为真的每个self元素。每次调用块时数组都会立即更改,而不是在迭代结束后更改。

因此,当您从 name_array 中删除元素时,您实际上是在从 Model.column_names 中删除它们,因为它们指向同一个东西。

如果您不想这样做,请在删除前duplicate the array

name_array = Model.column_names.dup
name_array.delete_if {|name| ["id","created_at","updated_at"].include?(name)}

【讨论】:

  • 谢谢。你和 iouri 的链接解决了我的问题。
【解决方案2】:

你也可以使用reject

a = [1,2,3]
a.reject{|x| x>=2}
=> [1]

【讨论】:

    【解决方案3】:

    Dup 可以提供帮助,但需要进行重组。 dup 创建“浅拷贝”的事实,它具有以下非显而易见的后果:

    > arr = Model.column_names.dup
    => ["id", "name", "klasse", "cars_count", "klasse_id"] 
    > arr.delete('id')
    => "id" 
    > arr
    => ["name", "klasse", "cars_count", "klasse_id"] 
    > Model.column_names
    => ["id", "name", "klasse", "cars_count", "klasse_id"] 
    > arr.each &:upcase!
    => ["NAME", "KLASSE", "CARS_COUNT", "KLASSE_ID"] 
    > Model.column_names
    => ["id", "NAME", "KLASSE", "CARS_COUNT", "KLASSE_ID"] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2017-11-06
      • 2015-08-29
      • 2018-01-24
      • 2019-04-12
      相关资源
      最近更新 更多