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

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

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

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

Q&A

解決済

1回答

500閲覧

railsでdb:seedを利用した初期データ作成について

begenner

総合スコア79

Ruby on Rails 4

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

0グッド

0クリップ

投稿2019/02/22 10:03

現在seeds.rbファイルを利用して初期データを作成していますがうまくいきません(m_ m)
わかる方がいらっしゃれば教えていただきますようよろしくお願いいたします(m
_m)

###エラー内容
bundle exec rake db:seedコマンドを実行すると下記のエラーが発生します

bash

1NoMethodError: undefined method `<<' for nil:NilClass

###期待する動作

  • 作成されるレコードをインスタンス変数に順次追加していきたい

(後の処理で利用、加工しやすくしたいため)
###動作環境
Ruby:2.4.5
Ruby on Rails: 4.2.11
MySQL: 5.7.18

###参考サイト

###わからないこと
seeds.rbファイルではactiverecordが使えるかわからない?

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

ruby

1# db/seeds.rb 2# item data 3item_count = 0 410.times do 5 rand(7..23).times do 6 item_count += 1 7 @items << Item.create!( 8 name: "商品-#{(item_count + 1).to_s}", 9 price: rand(4000..300000), 10 category_id: (1..10) 11 ) 12 end 13end 14 15@highprice_items = @items.where(‘price >= ?, 200000)

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

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

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

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

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

Stan_Dma

2019/02/23 00:01 編集

In the first place, I am afraid that your coding is not very appropriate as logic to write in a seed file. Launching this seed file many times should creates a great amount of 'item' objects that you wouldnt want to use. Better appropriate for seed file you might code it to add 'if @items.empty?', 'if @items.count < maxvalue' or something like that after getting '@items=Item.all'.
guest

回答1

0

ベストアンサー

@items や @highprice_items を items, highprice_items に変更する。
items = [] を item_count = 0 の次に追加する。

といった変更をしてみては?

追記

動作確認はしていませんが、コードを整理してみました。

ruby

110.times do 2 rand(7..23).times do |idx| 3 Item.create!( 4 name: "商品-#{idx + 1}", 5 price: rand(4_000..300_000), 6 category_id: (1..10) 7 ) 8 end 9end 10 11items = Item.all.order(:id) 12highprice_items = items.where(‘price >= ?, 200000)

投稿2019/02/22 16:43

編集2019/02/23 14:50
katoy

総合スコア22324

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

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

begenner

2019/02/23 04:24

ご返信ありがとうございます。 ご指摘いただいたように変更してみたところ、 下記の1行 highprice_items = items.where(‘price >= ?’, 200000) で NoMethodError: undefined method `where' for #<Array:0x00007f8aadff31d0> のエラーが発生しますが、そもそもseedファイルでactiverecordは使えないのでしょうか?
katoy

2019/02/23 10:06

items.where(...) は Item.where(...) にしてみてください。 item は 配列なので、where は使えません。 items に対して処理したいなら、 item.select { |x| x.price > 200000} とすればよいです。
begenner

2019/02/23 12:22

ありがとうございます。 期待通りの処理が実行されました!!
begenner

2019/02/23 14:11

ありがとうございます。 とてもわかりやすいです!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問