API 데이터를 테이블에 저장하는 방법
소개
포트폴리오를 작성하는 중에 라쿠텐 API 데이터를 테이블에 저장하고 싶다고 생각하면 다음 기사를 발견했습니다.
htps : // 코 m/히로아키_jr/있어 ms/983b11아45에2b42c8f3dc
이쪽의 기사를 참고로 나름대로 개량해 코드를 재작성했으므로 누군가의 참고가 된다고 생각해 드립니다.
환경
루비 2.6.5
rails 6.0.3
mysql 8.0.23
ER 다이어그램
유저(User 모델)가 아이템(Rakuten 모델)을 구입하고 싶은 리스트로서 등록(Buylist 모델) 할 수 있는 어소시에이션을 만들었습니다.
예를 들면 사용자가 게시물에 대해 좋아하는 것 같은 연관과 같다고 생각합니다.
Rakuten의 컬럼은 json으로 보내지는 데이터 중에서 필요한 데이터를 컬럼으로 만들었습니다.
컨트롤러
테이블의 작성, 라우팅의 기술, 모델의 어소시에이션의 설정은 할애하겠습니다.
주로 컨트롤러, 뷰의 부분의 기술을 설명하겠습니다.
rakutens_controller.rb
def index
#長いためprivetメソッドに定義
create_rakuten_data(params)
@items = Rakuten.all.page(params[:page])
# 全アイテム数
@total_count = @results.response.count
end
def search
@items = @q.result.page(params[:page]).per(30)
@count = @q.result.count
end
private
#楽天市場の店指定のアイテムを取得
def create_rakuten_data(params)
@results = RakutenWebService::Ichiba::Item.search(
shopCode: 'shop-senjin',
page: params[:page],
hits: 30)
#ここで取得したアイテムをテーブルに保存するがすでに保存されているアイテムは保存しない処理を行う
@results.each do |result|
#取得したデータの配列のresultを引数にprivetメソッドreadを呼び出し
item = Rakuten.new(read(result))
#rakutensテーブルに同じアイテムがあれば保存しない処理
unless Rakuten.all.exists?(item_name: item.item_name)
item.save
end
end
end
def read(result)
#Rakutenモデルのインスタンスに埋め込む
image_url = result['mediumImageUrls'][0]
item_name = result['itemName']
item_price = result['itemPrice']
item_url = result['itemUrl']
shop_name = result['shopCode']
genre_id = result['genreId']
review_average = result['reviewAverage']
{
image_urls: image_url,
item_name: item_name,
item_price: item_price,
item_url: item_url,
shop_name: shop_name,
genle_id: genre_id,
review_average: review_average
}
end
Rakuten API에서 얻은 Books 데이터에는 고유 한 컬럼 "isbn"이 있지만 Item에는 고유 한 컬럼이 없으므로 item_name을 고유 컬럼으로 취급했습니다.
보기
rakutens/index.html.haml.senjin-search
= search_form_for @q, url: search_rakutens_path do |f|
.text-center.my-3
%h4.my-2.font-weight-bold キーワード検索
= f.search_field :item_name_or_item_price_cont, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.text-center.my-3
%h4.my-2.font-weight-bold ジャンル検索
= f.select :genle_id_eq, {'バッグ、ポーチ、入れ物': 213693, 'バックパック,リュック': 111926, '手袋': 509058, '靴下': 408907, '小物,装具': 213694, 'Tシャツ': 551180, 'コンパス': 208078, 'GPS': 402305, 'サングラス、ゴーグル、フェイスフード': 213692, 'クッション、ベッド部品': 111925, 'ビニールテープ': 301594, 'ジャケット': 558873, '身分証入れ': 403809, 'トレーニングウェア': 302491, 'マット類': 501931}, { include_blank: '指定なし'}, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.senjin-counts
全アイテム数: #{@total_count} 件
.container
.row
= render 'commons/rakuten_item', items: @items
= paginate @items
commons/rakuten_item- items.each do |item|
.col-sm-4.col-md-4.col-lg-3.col-xl-2.mb-3
.senjin-item.mx-auto
.api-img
= link_to item.item_url do
= image_tag item.image_urls
.api-content
= item.item_name
.api
.api-title
購入金額
.api-value
#{item.item_price}円
.api
.api-title
平均評価
.api-value
#{item.review_average}
.buy-list.mt-2
- if current_user.has_buylist?(item)
.not-buy#unfollow-btn
= link_to '購入リストから解除', rakuten_buylist_path(item), method: 'delete',class: 'rakuten-delete'
- else
.buy#follow-btn
= link_to '購入リストに登録', rakuten_buylist_path(item), method: 'post',class: 'rakuten-post'
완성 이미지
이상으로 엉망이지만 설명을 끝내 드리겠습니다.
뭔가 질문이나 미비한 점 등 있으면 댓글을 주고 싶습니다.
Reference
이 문제에 관하여(API 데이터를 테이블에 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ikkorokoro/items/a5a708897e83eccb7b8c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
루비 2.6.5
rails 6.0.3
mysql 8.0.23
ER 다이어그램
유저(User 모델)가 아이템(Rakuten 모델)을 구입하고 싶은 리스트로서 등록(Buylist 모델) 할 수 있는 어소시에이션을 만들었습니다.
예를 들면 사용자가 게시물에 대해 좋아하는 것 같은 연관과 같다고 생각합니다.
Rakuten의 컬럼은 json으로 보내지는 데이터 중에서 필요한 데이터를 컬럼으로 만들었습니다.
컨트롤러
테이블의 작성, 라우팅의 기술, 모델의 어소시에이션의 설정은 할애하겠습니다.
주로 컨트롤러, 뷰의 부분의 기술을 설명하겠습니다.
rakutens_controller.rb
def index
#長いためprivetメソッドに定義
create_rakuten_data(params)
@items = Rakuten.all.page(params[:page])
# 全アイテム数
@total_count = @results.response.count
end
def search
@items = @q.result.page(params[:page]).per(30)
@count = @q.result.count
end
private
#楽天市場の店指定のアイテムを取得
def create_rakuten_data(params)
@results = RakutenWebService::Ichiba::Item.search(
shopCode: 'shop-senjin',
page: params[:page],
hits: 30)
#ここで取得したアイテムをテーブルに保存するがすでに保存されているアイテムは保存しない処理を行う
@results.each do |result|
#取得したデータの配列のresultを引数にprivetメソッドreadを呼び出し
item = Rakuten.new(read(result))
#rakutensテーブルに同じアイテムがあれば保存しない処理
unless Rakuten.all.exists?(item_name: item.item_name)
item.save
end
end
end
def read(result)
#Rakutenモデルのインスタンスに埋め込む
image_url = result['mediumImageUrls'][0]
item_name = result['itemName']
item_price = result['itemPrice']
item_url = result['itemUrl']
shop_name = result['shopCode']
genre_id = result['genreId']
review_average = result['reviewAverage']
{
image_urls: image_url,
item_name: item_name,
item_price: item_price,
item_url: item_url,
shop_name: shop_name,
genle_id: genre_id,
review_average: review_average
}
end
Rakuten API에서 얻은 Books 데이터에는 고유 한 컬럼 "isbn"이 있지만 Item에는 고유 한 컬럼이 없으므로 item_name을 고유 컬럼으로 취급했습니다.
보기
rakutens/index.html.haml.senjin-search
= search_form_for @q, url: search_rakutens_path do |f|
.text-center.my-3
%h4.my-2.font-weight-bold キーワード検索
= f.search_field :item_name_or_item_price_cont, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.text-center.my-3
%h4.my-2.font-weight-bold ジャンル検索
= f.select :genle_id_eq, {'バッグ、ポーチ、入れ物': 213693, 'バックパック,リュック': 111926, '手袋': 509058, '靴下': 408907, '小物,装具': 213694, 'Tシャツ': 551180, 'コンパス': 208078, 'GPS': 402305, 'サングラス、ゴーグル、フェイスフード': 213692, 'クッション、ベッド部品': 111925, 'ビニールテープ': 301594, 'ジャケット': 558873, '身分証入れ': 403809, 'トレーニングウェア': 302491, 'マット類': 501931}, { include_blank: '指定なし'}, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.senjin-counts
全アイテム数: #{@total_count} 件
.container
.row
= render 'commons/rakuten_item', items: @items
= paginate @items
commons/rakuten_item- items.each do |item|
.col-sm-4.col-md-4.col-lg-3.col-xl-2.mb-3
.senjin-item.mx-auto
.api-img
= link_to item.item_url do
= image_tag item.image_urls
.api-content
= item.item_name
.api
.api-title
購入金額
.api-value
#{item.item_price}円
.api
.api-title
平均評価
.api-value
#{item.review_average}
.buy-list.mt-2
- if current_user.has_buylist?(item)
.not-buy#unfollow-btn
= link_to '購入リストから解除', rakuten_buylist_path(item), method: 'delete',class: 'rakuten-delete'
- else
.buy#follow-btn
= link_to '購入リストに登録', rakuten_buylist_path(item), method: 'post',class: 'rakuten-post'
완성 이미지
이상으로 엉망이지만 설명을 끝내 드리겠습니다.
뭔가 질문이나 미비한 점 등 있으면 댓글을 주고 싶습니다.
Reference
이 문제에 관하여(API 데이터를 테이블에 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ikkorokoro/items/a5a708897e83eccb7b8c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
테이블의 작성, 라우팅의 기술, 모델의 어소시에이션의 설정은 할애하겠습니다.
주로 컨트롤러, 뷰의 부분의 기술을 설명하겠습니다.
rakutens_controller.rb
def index
#長いためprivetメソッドに定義
create_rakuten_data(params)
@items = Rakuten.all.page(params[:page])
# 全アイテム数
@total_count = @results.response.count
end
def search
@items = @q.result.page(params[:page]).per(30)
@count = @q.result.count
end
private
#楽天市場の店指定のアイテムを取得
def create_rakuten_data(params)
@results = RakutenWebService::Ichiba::Item.search(
shopCode: 'shop-senjin',
page: params[:page],
hits: 30)
#ここで取得したアイテムをテーブルに保存するがすでに保存されているアイテムは保存しない処理を行う
@results.each do |result|
#取得したデータの配列のresultを引数にprivetメソッドreadを呼び出し
item = Rakuten.new(read(result))
#rakutensテーブルに同じアイテムがあれば保存しない処理
unless Rakuten.all.exists?(item_name: item.item_name)
item.save
end
end
end
def read(result)
#Rakutenモデルのインスタンスに埋め込む
image_url = result['mediumImageUrls'][0]
item_name = result['itemName']
item_price = result['itemPrice']
item_url = result['itemUrl']
shop_name = result['shopCode']
genre_id = result['genreId']
review_average = result['reviewAverage']
{
image_urls: image_url,
item_name: item_name,
item_price: item_price,
item_url: item_url,
shop_name: shop_name,
genle_id: genre_id,
review_average: review_average
}
end
Rakuten API에서 얻은 Books 데이터에는 고유 한 컬럼 "isbn"이 있지만 Item에는 고유 한 컬럼이 없으므로 item_name을 고유 컬럼으로 취급했습니다.
보기
rakutens/index.html.haml.senjin-search
= search_form_for @q, url: search_rakutens_path do |f|
.text-center.my-3
%h4.my-2.font-weight-bold キーワード検索
= f.search_field :item_name_or_item_price_cont, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.text-center.my-3
%h4.my-2.font-weight-bold ジャンル検索
= f.select :genle_id_eq, {'バッグ、ポーチ、入れ物': 213693, 'バックパック,リュック': 111926, '手袋': 509058, '靴下': 408907, '小物,装具': 213694, 'Tシャツ': 551180, 'コンパス': 208078, 'GPS': 402305, 'サングラス、ゴーグル、フェイスフード': 213692, 'クッション、ベッド部品': 111925, 'ビニールテープ': 301594, 'ジャケット': 558873, '身分証入れ': 403809, 'トレーニングウェア': 302491, 'マット類': 501931}, { include_blank: '指定なし'}, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.senjin-counts
全アイテム数: #{@total_count} 件
.container
.row
= render 'commons/rakuten_item', items: @items
= paginate @items
commons/rakuten_item- items.each do |item|
.col-sm-4.col-md-4.col-lg-3.col-xl-2.mb-3
.senjin-item.mx-auto
.api-img
= link_to item.item_url do
= image_tag item.image_urls
.api-content
= item.item_name
.api
.api-title
購入金額
.api-value
#{item.item_price}円
.api
.api-title
平均評価
.api-value
#{item.review_average}
.buy-list.mt-2
- if current_user.has_buylist?(item)
.not-buy#unfollow-btn
= link_to '購入リストから解除', rakuten_buylist_path(item), method: 'delete',class: 'rakuten-delete'
- else
.buy#follow-btn
= link_to '購入リストに登録', rakuten_buylist_path(item), method: 'post',class: 'rakuten-post'
완성 이미지
이상으로 엉망이지만 설명을 끝내 드리겠습니다.
뭔가 질문이나 미비한 점 등 있으면 댓글을 주고 싶습니다.
Reference
이 문제에 관하여(API 데이터를 테이블에 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ikkorokoro/items/a5a708897e83eccb7b8c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
.senjin-search
= search_form_for @q, url: search_rakutens_path do |f|
.text-center.my-3
%h4.my-2.font-weight-bold キーワード検索
= f.search_field :item_name_or_item_price_cont, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.text-center.my-3
%h4.my-2.font-weight-bold ジャンル検索
= f.select :genle_id_eq, {'バッグ、ポーチ、入れ物': 213693, 'バックパック,リュック': 111926, '手袋': 509058, '靴下': 408907, '小物,装具': 213694, 'Tシャツ': 551180, 'コンパス': 208078, 'GPS': 402305, 'サングラス、ゴーグル、フェイスフード': 213692, 'クッション、ベッド部品': 111925, 'ビニールテープ': 301594, 'ジャケット': 558873, '身分証入れ': 403809, 'トレーニングウェア': 302491, 'マット類': 501931}, { include_blank: '指定なし'}, class: 'senjin-field'
= button_tag type: 'submit', class: 'icon senjin-icon' do
%i.fas.fa-search
.senjin-counts
全アイテム数: #{@total_count} 件
.container
.row
= render 'commons/rakuten_item', items: @items
= paginate @items
- items.each do |item|
.col-sm-4.col-md-4.col-lg-3.col-xl-2.mb-3
.senjin-item.mx-auto
.api-img
= link_to item.item_url do
= image_tag item.image_urls
.api-content
= item.item_name
.api
.api-title
購入金額
.api-value
#{item.item_price}円
.api
.api-title
平均評価
.api-value
#{item.review_average}
.buy-list.mt-2
- if current_user.has_buylist?(item)
.not-buy#unfollow-btn
= link_to '購入リストから解除', rakuten_buylist_path(item), method: 'delete',class: 'rakuten-delete'
- else
.buy#follow-btn
= link_to '購入リストに登録', rakuten_buylist_path(item), method: 'post',class: 'rakuten-post'
이상으로 엉망이지만 설명을 끝내 드리겠습니다.
뭔가 질문이나 미비한 점 등 있으면 댓글을 주고 싶습니다.
Reference
이 문제에 관하여(API 데이터를 테이블에 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ikkorokoro/items/a5a708897e83eccb7b8c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)