Вопрос

У меня есть предмет ActiveRecords И я пытаюсь установить значение по умолчанию («тестовый элемент») для каждого из них, используя блок.
В этом выражении:

list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.attributes["#{name}"] = "Test item"] }

Значения не установлены.

Я должен использовать @item.attributes["#{name}"] для интерполяции, потому что я не могу сделать это для каждого элемента:

@item.tipe1 = "Test item"

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

Это было полезно?

Решение

Назначение @items.attributes["#{name}"] = "Test item"] не работает, потому что attributes Метод возвращает новый хэш -объект каждый раз, когда вы его называете. Таким образом, вы не меняете ценность @items'Объект, как вы думали. Вместо этого вы меняете ценность нового хэша, который был возвращен. И этот хэш теряется после каждой итерации (и, конечно, когда each Блок закончился).

Возможным решением было бы создать новый хэш с ключами @items'атрибуты и назначить это через attributes= метод

h = Hash.new

# this creates a new hash object based on @items.attributes
# with all values set to "Test Item"
@items.attributes.each { |key, value| h[key] = "Test Item" }

@items.attributes = h

Другие советы

Вы можете использовать метод отправки для этой цели. Возможно, как это:

list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.send("#{name}=", "Test item") }

Я думаю, что проблема в том, что вы меняете только возвращенный атрибутный хэш, а не объект Activerecord.

Вам нужно сделать что -то вроде:

# make hash h
@items.attributes = h

Следуя вашему примеру, возможно, что -то вроде:

@items.attributes = %w{type1 type2 type3 type4}.inject({}) { |m, e| m[e] = 'Test item'; m }

КСТАТИ, "#{e}" то же самое, что и выражение строки e или для любого типа: e.to_s. Анкет Второй пример, возможно, легче читать:

a = %w{type1 type2 type3 type4}
h = {}
a.each { |name| h[name] = 'test item' }
@items.attributes = h

С использованием attributes= Метод, вероятно, предназначен для константы хэша, например:

@items.attributes = { :field => 'value', :anotherfield => 'value' }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top