Pregunta

Tengo una ActiveRecords elemento y estoy tratando de establecer un valor predeterminado ( "elemento de prueba") para cada uno de ellos con un bloque.
En esta expresión:

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

Los valores no están ajustados.

Me debe utilizar para la interpolación @item.attributes["#{name}"] porque no puedo hacer esto para cada elemento:

@item.tipe1 = "Test item"

Por lo tanto, lo que ocurre en el primer estado de cuenta? ¿Por qué? Si lo que me gustaría hacer no es posible de esa manera, ¿cómo puedo hacer lo mismo?

¿Fue útil?

Solución

El @items.attributes["#{name}"] = "Test item"] asignación no funciona, ya que el método attributes devuelve un nuevo objeto hash cada vez que la llame. Así que no va a cambiar el valor del objeto @items' como se pensaba. En su lugar va a cambiar el valor de la nueva Hash que ha sido devuelto. Y este Hash se pierde después de cada iteración (y, por supuesto, cuando el bloque each ha terminado).

Una posible solución sería la creación de un nuevo hash con las llaves del @items' atributos y ceder el presente a través del método 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

Otros consejos

Se puede utilizar el método de envío para este propósito. Tal como esto:

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

Creo que el problema es que sólo está cambiando el hash atributo devuelto, no el objeto ActiveRecord.

Es necesario hacer algo como:

# make hash h
@items.attributes = h

Siguiendo tu ejemplo, tal vez algo como:

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

BTW, "#{e}" es la misma cosa que Cadena e expresión o para cualquier tipo: e.to_s. Un segundo ejemplo, tal vez más fácil de leer:

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

Utilizando el método attributes= probablemente se propone para las constantes de hash, como:

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

Para los atributos generados por completo podría tomar sugerencia y utilizar el envío de DanneManne.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top