API 데이터를 테이블에 저장하는 방법

17063 단어 JSON루비Railsapi

소개



포트폴리오를 작성하는 중에 라쿠텐 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'

완성 이미지





이상으로 엉망이지만 설명을 끝내 드리겠습니다.
뭔가 질문이나 미비한 점 등 있으면 댓글을 주고 싶습니다.

좋은 웹페이지 즐겨찾기