Проблемы с настройкой атрибутов
-
15-10-2019 - |
Вопрос
У меня есть предмет 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' }
Для полностью сгенерированных атрибутов, которые вы могли бы взять Даннеманна Предложение и использование отправки.