/ / (Ruby on Rails) Aide pour ajouter Hash à DB - ruby, ruby-on-rails-4, hash, yaml

(Ruby on Rails) Aide pour ajouter Hash à DB - ruby, ruby-on-rails-4, hash, yaml

Ruby 2.0, Rails 4.1.0, sQlite3. Je dois créer des paramètres dans Hash à ajouter à ma base de données. J'ai un fichier et un modèle yaml:

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

J'ai 15 utilisateurs. Essayez d'exécuter ce code

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])

Et obtenir une erreur ActiveRecord :: UnknownAttributeError: attribut inconnu: utilisateur

Quel est le problème?

Réponses:

1 pour la réponse № 1

Tout d'abord, tout ce qui commence par une majuscule en Ruby est traité comme une constante. La réattribution d'une constante entraîne un avertissement. Spécifiquement:

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

Exemples:

class User
module Huggable
TAU = 2 * PI

Les variables doivent par convention être dans snakecase tel que:

user_tweet_params

Deuxièmement, vous pouvez partir for boucles derrière. Ruby a de bien meilleures méthodes pour boucler dans les tableaux et autres énumérables tels que 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