🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

1回答

2611閲覧

insert_allで配列データを一括保存したい

ik_ko

総合スコア9

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

0グッド

1クリップ

投稿2021/03/21 07:20

いつもお世話になっています。
現在ポートフォリオを作成中なのですがエラーが解決できない状態ですのでご教授頂きたいです。

環境

rails
mysql

状況

クラスのインスタンスの配列をinsert_allメソッドを使い、一括保存したいが以下のエラーが出てググったりと記事を見て、試しましたが解決できない状況ですのでご教授頂きたいです。
#エラーログ

NoMethodError - undefined method `keys' for #<Rakuten:0x00007fd4a9d49dd0>: app/controllers/rakutens_controller.rb:17:in `index' Started POST "/__better_errors/ec76e08566d64a16/variables" for ::1 at 2021-03-21 15:53:52 +0900

記述コード

マイグレーション

class CreateRakutens < ActiveRecord::Migration[6.0] def change create_table :rakutens do |t| t.string :item_name t.integer :item_price t.string :item_url t.string :image_urls t.integer :review_average t.string :shop_name t.string :genle_id t.timestamps end end end

rakuten_controller.rb
マイグレーションには「genle_id」としていますがjsonで送られてくるデータは「genre_id」ですので下記の記述で合っていない箇所がありますので訂正しておきます。

Class RakutensController < ApplicationController PER = 30 def index @items = [] #楽天Apiのデータ取得 results = RakutenWebService::Ichiba::Item.search( shopCode: 'shop-senjin', page: params[:page], hits: PER) # read(result)については、privateメソッドで設定。 results.each do |result|    #rakutenクラスのインスタンスの作成 item = Rakuten.new(read(result)) # Rakutenテーブルに入っている重複するデータは配列に入れない unless Rakuten.all.include?(item) @items << item end end #配列の中身があるか確認 unless @items.empty? Rakuten.insert_all(@items) end @items = Rakuten.all.page(params[:page]) end private def read(result) image_url = result["mediumImageUrls"][0] item_name = result["itemName"] item_price = result["itemPrice"] item_url = result["itemUrl"] shop_name = result['shopCode'] genle_id = result["genreId"] review_average = result['reviewAverage'] created_at = Time.current updated_at = Time.current { image_urls: image_url, item_name: item_name, item_price: item_price, item_url: item_url, shop_name: shop_name, genle_id: genle_id, review_average: review_average, created_at: created_at, updated_at: updated_at } end

試したこと

キーが入っていない可能性があると考え、コンソールで調べましたが、特に異常はなくしっかりとデータが入っていました。

[#<Rakuten id: nil, item_name: "コイルストラップ6cm(2本入)フック新【陸上自衛隊 自衛隊 迷彩 戦人 Senjin ミリタリー ...", item_price: 418, item_url: "https://item.rakuten.co.jp/shop-senjin/6567/", image_urls: "https://thumbnail.image.rakuten.co.jp/@0_mall/shop...", review_average: 0, shop_name: "shop-senjin", genle_id: "213694", created_at: "2021-03-21 07:12:51", updated_at: "2021-03-21 07:12:51">,

記述の仕方ももう一度調べて、違う記述の仕方も試しましたが、同じエラーが発生してしまいました。
以下試した書き方

insert_all items
Rakuten.insert_all items

わかる方いましたらご教授お願いします。

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

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

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

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

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

guest

回答1

0

自己解決

一括ではありませんが以下のように記述し対応することにしました

PER = 30 def index items = [] results = RakutenWebService::Ichiba::Item.search( shopCode: 'shop-senjin', page: params[:page], hits: PER) #resultsに楽天APIから取得したデータ(jsonデータ)を格納します。 # read(result)に、privateメソッド results.each do |result| item = Rakuten.new(read(result)) items << item end #「items」内の各データを保存。 #すでに保存済は除外するためにunless使用。 items.each do |item| unless Rakuten.all.include?(item) item.save end end @items = Rakuten.all.page(params[:page]) # 商品数 @total_count = results.response.count end

投稿2021/03/22 13:47

ik_ko

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問