Проблема с настройкой атрибутов - PullRequest
4 голосов
/ 21 января 2011

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

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

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

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

@item.tipe1 = "Test item"

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

Ответы [ 3 ]

2 голосов
/ 21 января 2011

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

list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.send("#{name}=", "Test item") }
2 голосов
/ 21 января 2011

Назначение @items.attributes["#{name}"] = "Test item"] не работает, потому что метод attributes возвращает новый объект Hash каждый раз, когда вы вызываете его. Таким образом, вы не меняете значение объекта @items ', как вы думали. Вместо этого вы меняете значение нового Hash, который был возвращен. И этот хэш теряется после каждой итерации (и, конечно, после завершения блока 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
1 голос
/ 21 января 2011

Мне кажется, проблема в том, что вы меняете только возвращенный хэш атрибута, а не объект 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' }

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

...