/ / (Ruby on Rails) Ayuda para agregar Hash a DB - ruby, ruby-on-rails-4, hash, yaml

(Ruby on Rails) Ayuda para agregar Hash a DB - ruby, ruby-on-rails-4, hash, yaml

Ruby 2.0, Rails 4.1.0, sQlite3. Tengo que crear params en Hash para agregar a mi db. Tengo archivo y modelo yaml:

class User < ActiveRecord::Base
has_many :tweets
accepts_nested_attributes_for :tweets
end
class Tweet < ActiveRecord::Base
belongs_to :user
end

Tengo 15 usuarios Intenta ejecutar este código

UsTw_model_params = {user: []}

count_of_users = seeds_yml["users"].length - 1

for i in 0..count_of_users do
UsTw_model_params[:user][i] = {}
UsTw_model_params[:user][i][:name] = seeds_yml["users"][i]["name"]
UsTw_model_params[:user][i][:email] = seeds_yml["users"][i]["email"]
UsTw_model_params[:user][i][:password] = seeds_yml["users"][i]["password"]
UsTw_model_params[:user][i][:avatar] = seeds_yml["users"][i]["avatar"]
UsTw_model_params[:user][i][:tweets_attributes] = []

if seeds_yml["users"][i].has_key?(:tweets)
count_of_tweets = seeds_yml["users"][i]["tweets"].length - 1
for j in 0..count_of_tweets do
UsTw_model_params[:user][i][:tweets_attributes][j] = {}
UsTw_model_params[:user][i][:tweets_attributes][j][:post] = seeds_yml["users"][i]["tweets"][j]["post"]
UsTw_model_params[:user][i][:tweets_attributes][j][:created_at] = seeds_yml["users"][i]["tweets"][j]["created_at"]
end
end
end

User.create(UsTw_model_params[:user])

Y obtener error ActiveRecord :: UnknownAttributeError: atributo desconocido: usuario

¿Qué pasa?

Respuestas

1 para la respuesta № 1

En primer lugar, todo lo que comienza con una letra mayúscula en Ruby se trata como una constante. La reasignación de un resultado constante en una advertencia. Específicamente:

UsTw_model_params = {user: []} # is a constant!

Ejemplos:

class User
module Huggable
TAU = 2 * PI

Las variables deberían por convención estar en una caja de serpiente como:

user_tweet_params

Segundo, puedes irte for bucles detrás. Ruby tiene métodos mucho mejores para recorrer dentro de las matrices y otros elementos consumibles como map, each, etc.

# Loop though seeds_yml["users"] and create a new array
user_tweet_params = seeds_yml["users"].map do |user|
# with_indifferent_access allows us to use symbols or strings as keys
user = user.with_indifferent_access
user.slice!(:name, :email, :password, :avatar, :tweets)

# Does the user have tweets?
# We use try(:any?) incase user["tweets"] is nil
if user[:tweets].try(:any?)
# Take the tweets and nest then under tweet_attributes
user[:tweet_attributes] = user.tweets.map do |tweet|
tweet.with_indifferent_access.slice!(:post, :created_at)
end
end

# remove the original tweets
user.delete(:tweets)
# return user
user
end