Rails에서 Google Spreadsheets + Active Record를 사용하여 데이터 동기화
11170 단어 Rails
나 이런 거 하고 있어.
이런 전자 표를 준비해라.
제목은 무엇이든지 좋습니다.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_row
이 user
이 아니라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 = :bearer
로 GoogleSpreadsheets::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
스프레드시트의 열 이름은 대문자나 기호 클래스를 사용할 수 없습니다(모두 소문자로 변경되고 기호 클래스는 삭제됨).
Reference
이 문제에 관하여(Rails에서 Google Spreadsheets + Active Record를 사용하여 데이터 동기화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tkawa/items/04fc6f0574122d4a3fd2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)