Rails에서 Google Spreadsheets + Active Record를 사용하여 데이터 동기화

11170 단어 Rails
(추가) OAuth2 인증을 지원합니다.

나 이런 거 하고 있어.


이런 전자 표를 준비해라.
제목은 무엇이든지 좋습니다.id는 필수입니다.워크시트의 이름은 기본적으로 [モデル名]_rows입니다.
spreadsheet = GoogleSpreadsheets::Enhanced::Spreadsheet.find('0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c')
# GET /feeds/spreadsheets/private/full/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c HTTP/1.1
# Authorization: GoogleLogin auth=xxxx
# Accept: application/atom+xml
# Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
# User-Agent: Ruby
# Connection: close
# Host: spreadsheets.google.com
# 
# HTTP/1.1 200 OK
# …
#
# => #<GoogleSpreadsheets::Enhanced::Spreadsheet:0x007f95d2283880>

worksheet = spreadsheet.worksheets.find_by(title: 'user_rows')
# GET /feeds/worksheets/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c/private/full HTTP/1.1
# …
#
# => #<GoogleSpreadsheets::Enhanced::Worksheet:0x007f95d2338780>

rows = worksheet.rows
# GET /feeds/list/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c/od1/private/full HTTP/1.1
# …
#
# => #<GoogleSpreadsheets::Enhanced::Collection:0x007f95d2492158>
이런 느낌으로 spreadsheet에서 전진할 수 있다.

ActiveRecord와 동기화


app/models/user.rb
class User < ActiveRecord::Base
  include GoogleSpreadsheets::Enhanced::Syncing
  sync_with :user_rows, spreadsheet_id: '0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c'
  after_commit :sync_user_row
end
sync_with :user_rows를 통해 다음과 같은 방법을 정의합니다.has_many :user_rows와 유사한 인상)
  • user_rows
  • sync_with_user_rows
  • sync_user_row
  • User.user_rows


    이 방법은 자동으로 spreadsheets에서 링크를 따라Active Resource 대상 (모음집) 을 되돌려줍니다.
    user_rows = User.user_rows
    
    # GET /feeds/spreadsheets/private/full/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c HTTP/1.1
    # …
    # GET /feeds/worksheets/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c/private/full HTTP/1.1
    # …
    # GET /feeds/list/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c/od1/private/full HTTP/1.1
    # …
    # => #<GoogleSpreadsheets::Enhanced::Collection:0x007f87cc7bccc0 @elements=[#<GoogleSpreadsheets::Enhanced::Row:0x007f87cc7bcb30 @attributes={…}, …
    
    
    Active Resource 대상find 또는 save이기 때문에 Active Record와 유사한 처리를 할 수 있습니다.
    user_row = user_rows.find(id)
    user_row.name = 'foo'
    user_row.save
    # PUT /feeds/list/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c/od1/private/full HTTP/1.1
    # …
    

    User.sync_with_user_rows


    Spreadsheet의 데이터는 sync_with_user_rows 방법을 통해Active Record 측으로 통일적으로 동기화할 수 있다.
    User.sync_with_user_rows
    
    # GET /feeds/list/0AtkgjSZyl3NLdEE1S0lvbEdZLU00ZndhMXFzLW44SlE/od1/private/full HTTP/1.1
    #
    # begin transaction
    # UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = 1  [["name", “foo"],  ["updated_at", Sun, 29 Dec 2013 23:17:30 JST +09:00]]
    # UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = 13  [["name", "bar"],  ["updated_at", Sun, 29 Dec 2013 23:17:31 JST +09:00]]
    # commit transaction
    
    

    User#sync_user_row


    기록 단위로 작업표 옆으로 동기화하는 방법.after_commit :sync_user_row가 기록되면 일반 대상user_rowuser이 아니라save가 동기화됩니다.
    user = User.find(id)
    user.name = 'bar'
    user.save
    
    # UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = 13  [["name", "bar"],  ["updated_at", Sun, 29 Dec 2013 23:17:30 JST +09:00]]
    #
    # PUT /feeds/list/0AtkgjSZyl3NLdERqdkdMZk01alFLWXZUZUtuNlcwN3c/od1/private/full HTTP/1.1
    # …
    

    설정


    0.1.0에서 OAuth2를 지원합니다.GoogleSpreadsheets::Base.auth_type = :bearerGoogleSpreadsheets::Base.access_token에서 얻은access token을 설정하십시오.
    블로킹을 GoogleSpreadsheets::Base.access_token do ... end 형태로 전달할 수도 있다.필요할 때 호출되기 때문에 리프레시 등에 사용할 수 있다.

    Service Acceounts의 경우


    사용자의 개별 권한(2-legged)이 필요하지 않을 때Service Accounts 방식으로access token을 얻습니다.나는 이런 상황에서 편리한 반을 준비했다.
    Google Developers Console에서 프로젝트를 만들고 인증 정보에서'새 클라이언트 ID 만들기'와'서비스 계정 만들기'를 선택하여 프로젝트를 만드십시오.

    클라이언트 ID가 완료되면 새 JSON 키 생성을 사용하여 JSON 파일을 다운로드합니다.
    그중의 client이메일 및 privet키는 다음과 같이 설정하십시오.
    config/initializers/google_spreadsheet.rb
    GoogleSpreadsheets::Base.auth_type = :bearer
    GoogleSpreadsheets::Base.access_token =
      GoogleSpreadsheets::Auth::ServiceAccountsAccessToken.new(
        client_email: '000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com',
        private_key_pem: "-----BEGIN PRIVATE KEY-----\n..."
      )
    
    스프레드시트가 공개되지 않은 경우 위client_email에 설정된 사용자 권한 공유 설정[email protected]에 액세스할 수 있습니다.
    참조: http://d.hatena.ne.jp/sugyan/20130112/1357996092
    다른 방식으로 대응하는 반을 만들 수도 있다.

    이전 기술에서는 다음 ClientLogiin 인증을 권장하지 않습니다.


    Google 사용자 이름과 암호를 설정해야 합니다.
    config/initializers/google_spreadsheet.rb
    GoogleSpreadsheets::Base.user = '[email protected]'
    GoogleSpreadsheets::Base.password = 'password'
    
    ※ 2단계 인증 획득 시 애플리케이션별 암호 생성 사용하세요.

    사용자 지정 범주 사용

    sync_with :user_rows의 경우 명칭에 대응하는UserRow클래스가 존재하면 이 클래스를 사용한다.has_many와 유사한 인상)
    스프레드시트의 열 이름이 속성 이름과 다른 경우 사용자 정의 카테고리attr_aliases를 만들어 지정할 수 있습니다.
    app/models/user_row.rb
    class UserRow < GoogleSpreadsheets::Enhanced::Row
      attr_aliases(
        name:    '名前',
        address: '住所'
      )
      # user.name で 「名前」列
      # user.address で 「住所」列にアクセスできる
    end
    
    스프레드시트의 열 이름은 대문자나 기호 클래스를 사용할 수 없습니다(모두 소문자로 변경되고 기호 클래스는 삭제됨).

    좋은 웹페이지 즐겨찾기