0

私が行った場合:

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_arrayModel.column_names配列ではなく、名前が削除されるのは私の推測でした。

Rails 3.0.13 Ruby 1.9.3

4

3 に答える 3

5

以下については、アレイのドキュメントを参照してくださいdelete_if

ブロックがtrueと評価されるselfのすべての要素を削除します。配列は、反復が終了した後ではなく、ブロックが呼び出されるたびに即座に変更されます。

したがって、から要素を削除すると、同じものを指しているため、name_array実際にはから要素を削除することになります。Model.column_names

それをしたくない場合は、削除する前にアレイを複製してください。

name_array = Model.column_names.dup
name_array.delete_if {|name| ["id","created_at","updated_at"].include?(name)}
于 2012-10-11T04:01:27.857 に答える
2

uはrejectも使用できます

a = [1,2,3]
a.reject{|x| x>=2}
=> [1]
于 2012-10-11T04:09:49.377 に答える
2

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"] 
于 2012-10-11T05:23:53.007 に答える