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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3670閲覧

Rails4 undefined method `each' for 1:Fixnum (NoMethodError)

smith

総合スコア73

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2015/03/18 09:26

編集2015/03/18 11:45

このエラーはどういう意味ですか?
no_check_itemを確認しましたがレコードが入っているので
動くはずなのに動きません

lib/tasks/item.rb:14:in formation_check': undefined method each' for 1:Fixnum (NoMethodError)

lang

1 2require "#{Rails.root}/app/models/item" 3require "#{Rails.root}/app/models/navi" 4 5class Tasks::Item 6 7 8 def self.formation_check#リミットの指定が悪い可能性 9 10 no_check_item = Item.where(limit_day: Time.mktime(2014, 12, 24, 00, 00, 00).prev_year..Time.now, limit_check: false) 11 12 unless no_check_item.count == 0 13 checked_item = no_check_item.update_all({limit_check: true}) 14 checked_item.each do |item| 15 Navi.create(exhibitor: item.user_id, item_id: item.id, status: 1) 16 end 17 end 18 end 19 20 21end

lang

1#修正後 2 3class Tasks::Item 4 5 def self.formation_check 6 7 no_check_item = Item.where(limit_day: Time.mktime(2014, 12, 24, 00, 00, 00).prev_year..Time.now, limit_check: false) 8 9 unless no_check_item.count == 0 10 no_check_item.each do |item| 11 Navi.create(exhibitor: item.user_id, item_id: item.id, status: 1) 12 item.update({limit_check: true}) 13 end 14 end 15 end 16 17 18end

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

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

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

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

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

guest

回答1

0

ベストアンサー

update_allは更新したデータの行数を返すため、checked_itemがFixnumになっています。


追記:

些事ですが

  • データ数がゼロなら、eachで回しても問題ありません。
  • データが多くなることを考えると、eachよりfind_eachを使う方がよいです。
  • 複数のデータを変更するばあいは、transactionで囲った方がよいでしょう。

ですので

lang

1# before 2unless no_check_item.count == 0 3 no_check_item.each do |item| 4 Navi.create(exhibitor: item.user_id, item_id: item.id, status: 1) 5 item.update({limit_check: true}) 6 end 7end

は、

lang

1#after 2Item.transaction do 3 no_check_item.find_each do |item| 4 Navi.create(exhibitor: item.user_id, item_id: item.id, status: 1) 5 item.update(limit_check: true) 6 end 7end

とするのがよいでしょう。

また、これ以降no_checked_itemのインスタンスには触れない(※)のであれば最初のようにupdate_allを使ってもよいと思います。
※)update_allはデータベースを直接変更するので、Railsから見えるno_check_itemの中身はチェックされていない状態が続きます。チェックされた状態のインスタンスが必要であればリロードする必要があります。

lang

1Item.transaction do 2 no_check_item.find_each do |item| 3 Navi.create(exhibitor: item.user_id, item_id: item.id, status: 1) 4 end 5 no_check_item.update_all(limit_check: true) # 戻り値は読まなくてOK 6end

ループ中のcreateのパフォーマンスも気になるようであれば、activerecord-importというgemを利用するのがよいでしょう。

投稿2015/03/18 09:34

編集2015/03/18 23:05
hello-world

総合スコア1342

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

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

smith

2015/03/18 11:41

すべてのメソッドで試しましたがうまくいかなかったので 上記のように修正しました。2週間ほど詰まっていて悶絶していましたが ヒントを頂いたおかげでひらめくことができました。 ありがとうございます!もっといい書き方あれば教えてください
hello-world

2015/03/18 23:04

> もっといい書き方あれば教えてください 一応追記しました。
smith

2015/03/19 13:20

感謝します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問