質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

3147閲覧

seedファイルでundefined method `created_at'のエラーが発生する

begenner

総合スコア79

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2019/02/23 14:09

編集2019/02/24 02:10

現在seedファイルでデータを作成していますが、うまくいきません(m_ m)
userテーブルのデータを作成し、それを元に別テーブル(cartitem)のデータを作る際にエラーが発生します。
わかる方がいらっしゃれば教えていただきますようよろしくお願いいたします(m
_m)

###エラー内容

bash

1NoMethodError: undefined method `created_at' for nil:NilClass
  • ループしている時はエラーが発生せずレコードが作成されている
  • ループが終了すると上記のエラーが発生する
  • データベースには保存されている

###期待する動作

  • エラーが発生せずにdb:seedコマンドを完了・終了したい
  • cartitemのレコード作成日がuserデータ作成後の10分後に作成されたようなレコードを作成したい

###動作環境
Ruby:2.4.5
Ruby on Rails: 4.2.11

###該当のソースコード

ruby

1# db/seeds.rb 2 3# ユーザーデータの作成 4users = [] 5user_count = 0 6 710.times do 8 user_count += 1 9 users << User.create!( 10 name: "ユーザー #{user_count.to_s}", 11 withdrawal: nil, 12 created_at: t.ago((3 - g).years)- h.day 13 ) 14end 15 16# 別で作成してあります 17item_count = 100 18 19# カート商品の作成 20user_count.times do |i| 21 22 cartitem = Cartitem.create!( 23 user_id: nil, 24 item_id: rand(1..item_count), 25 quantity: rand(1..4), 26 order_id: nil, 27 created_at: users[i + 1].created_at + 10 * 60, 28 updated_at: users[i + 1].created_at + 10 * 60 29 ) 30end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらくですが、
usersという配列にUserモデルのインスタンスを格納しているのにも関わらず、

Ruby

11.upto(user_count) do |i| 2... 3 created_at: users[i].created_at + 10 * 60, 4... 5end

上記のコードでインデックスを1から始めているからではないでしょうか。
Rubyは0オリジンなので、usersという変数に入っているデータは10個ですが、
インデックスは0~9までです。

投稿2019/02/23 15:18

ReiLeiLei1025

総合スコア236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

begenner

2019/02/24 01:39

最初は users.each do |i| としていましたがうまくいきませんでした。 それをふまえて user_count.times do |i| としてみましたがうまくいきませんでした(m_ _m)
ReiLeiLei1025

2019/02/24 01:49

users.each do |user| cartitem = Cartitem.create!( user_id: nil, item_id: rand(1..item_count), quantity: rand(1..4), order_id: nil, created_at: (user.created_at) + 10 * 60, updated_at: (user.created_at) + 10 * 60 ) end これではどうでしょうか? 質問を更新されているようで本旨が変わってしまっていますが。
ReiLeiLei1025

2019/02/24 01:53

users.size.times do |i| cartitem = Cartitem.create!( user_id: nil, item_id: rand(1..item_count), quantity: rand(1..4), order_id: nil, created_at: (users[i].created_at) + 10 * 60, updated_at: (users[i].created_at) + 10 * 60 ) end インデックスを利用するならこっちでしょうか。 iは0から始まるので、 created_at: users[i + 1].created_at + 10 * 60, を created_at: users[i].created_at + 10 * 60, にしてみたらどうですか。
begenner

2019/02/24 02:07

ご返答いただきありがとうございます。 ご指摘いただいた通りに修正してみましたが、同じエラーが表示されます。 念のためschema.rbファイルも確認しましたがuserテーブルにもcartitemテーブルにもcreated_atカラムが存在します
ReiLeiLei1025

2019/02/24 02:47

そうですか。では、ログを吐き出してみましょうか。 users.size.times do |i| p users[i] p users[i].created_at cartitem = Cartitem.create!( user_id: nil, item_id: rand(1..item_count), quantity: rand(1..4), order_id: nil, created_at: (users[i].created_at) + 10 * 60, updated_at: (users[i].created_at) + 10 * 60 ) end このようにするとコンソールには何が出力されますでしょうか。 それを確認すると何か分かるかもしれません。
begenner

2019/02/24 02:55

出てきたログは #<User id: 1, name: "ユーザー 1", withdrawal: nil, created_at: "2016-02-22 02:54:25", updated_at: "2019-02-24 02:54:25"> Mon, 22 Feb 2016 02:54:25 UTC +00:00 のようになっています。
begenner

2019/02/24 02:59

すいません、問題なくdb:seedコマンドが完了しました。 原因は users[i] を users[i + 1] のままにしていたことだと思われます。 真摯にご対応いただきありがとうございました!!
ReiLeiLei1025

2019/02/24 03:19

良かったです。 プログラミング、楽しまれて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問