이것은 일부 레일 및 몽고 샘플을 통해 속도를 높이기 위해 고심하고있는 부분 일 수 있습니다. 나는 API로부터 JSON 문자열을 얻었고 그것을 mongo에 넣었다. 따라서 문서 구조를 변경하는 것은 실제로 선택 사항이 아닙니다. 그런 다음이를 데이터를 사용할 수 있도록 레일스 모델로 매핑하려고했습니다.MongoID 임베디드 문서가없는 레일즈 내 모델에 매핑 없음
JSON은 많은 LogLines를 포함하는 많은 트랜잭션을 포함하는 보고서입니다.
< Report _id: 583 c3baac0baf90a7ee26f6e,
ReportName: "PtSomIntPerfThreeLevelTest-1480341940187",
TestName: "PtSomIntPerfThreeLevelTest",
Transactions: [{
"colId" => "50437d6c-49c1",
"InfoPlate" => "[0SXdokPL-R13VQZwi]",
"rowId" => "1",
"sortDate" => 1480341975952,
"transactionType" => "REQUEST",
"description" => "description text for my document",
"startDate" => "11/28/2016 14:06:15",
"startDateMS" => 1480341975952,
"endDate" => "11/28/2016 14:06:23",
"endDateMS" => 1480341983069,
"finalEndDate" => "11/28/2016 14:06:23",
"finalEndDateMS" => 1480341983069,
"completeDuration" => "7 seconds",
"completeDurationMS" => 7117,
"feedProcessingDuration" => "7 seconds",
"feedProcessingDurationMS" => 7117,
"logLines" => [{
"id" => "1062b1ca-0f04",
"timestamp" => 1480341975952,
"transactionType" => "REQUEST",
"transactionStep" => "RECEIVE",
"collationId" => "50437d6c-49c1-438a-9b8",
"runName" => "runName-1480341940187",
"msg" => "Import default",
"elapsedSeconds" => "0.0",
"elapsedMS" => 0,
"InfoPlate" => "[0SXdokPL-3rmxW3oH]"
},
내가 보고서 모델을 가지고 문서 및 트랜잭션 모델
코드 조각은 내 보고서 모델은 내가 기반의 단일 보고서 문서를 얻을 수있는 좋은 않습니다 (I는 한 번에 1을 수행 한 후 LogLines을 할 것입니다) ID에 저장하고 보고서를 리턴합니다. 그런 다음 "report.transactions"를 수행하고 트랜잭션의 json blob을 얻을 수 있습니다 (거의 항상 여러 개의 트랜잭션이 보고서에 포함됨). 그러나 트랜잭션 모델로 인식되지 않습니다 (아래의 모든 코드가 게시됩니다). 그래서 트랜잭션을 말할 수 없습니다 .InfoPlate I 그러한 메소드 오류가 없습니다. 내 모델에는 관계가 있지만 몽고이 (mongoid)에 캐스팅 된 레일을 보는 "the field : Transactions, type : Array"도 있습니다. 그것 없이는 아무것도 얻지 못합니다. 그래서 "embeds_many : transactions"관계는 내가 report.transaction을 얻도록 허용하지 않습니다. 죄송합니다 혼란 스러울 경우 레일즈 용어가 낮습니다. 짧고 땀 나는 보고서를 얻고 거래를하고 거래를 할 수 있기를 원합니다 .ColID와 col ID를 얻으십시오.
제 목표는 문서 보고서, 트랜잭션, LogLines의 각 부분에 대한 모델을 얻는 것입니다. 나는 그 일을하는 법을 이해하지 못하는 것 같습니다.
보고서 모델 (작품 파인)
class Report
include Mongoid::Document
field :ReportName, type: String
field :TestName, type: String
field :Transactions, type: Array
field :ReportDurationMS, type: String
embeds_many :transactions
end
트랜잭션 모델
class Transaction
include Mongoid::Document
field :colId, type: String
field :InfoPlate, type: String
field :rowId, type: String
field :sortDate, type: String
field :transactionDate, type: String
field :description, type: String
field :startDate, type: String
field :startDateMS, type: Integer
field :endDate, type: String
field :endDateMS, type: Integer
field :finalEndDate, type: String
field :completeDuration, type: String
field :completeDurationMS, type: Integer
field :feedProcessingDuration, type: String
field :feedProcessingDurationMS, type: Integer
field :logLines, type: Array
embedded_in :report, :inverse_of => :transactions
end
보고서 컨트롤러 (색인 방법) 나는 주위
def index
@reports = Report.all
Rails.logger.info("********* #{@reports.inspect} ***********")
end
트랜잭션 컨트롤러 해킹 동안 디버그 로거 그냥가 (이것은 내가 모델로 트랜잭션을 반환 할 수없는 것이다) 트랜잭션을 얻는다. @ report.transactions에서 돌아 왔지만 루비 모델과는 달리 json이라는 문자열 만 사용합니다. 또는 최소한 @ transaction.colId와 같은 것은 호출 할 수 없습니다. 그런 방법을 반환하지 않습니다. 트랜잭션은 배열이 많기 때문에 transactions.first.InfoPlate를 시도했지만 레일스가 JSON 문자열이 아닌 트랜잭션으로 보이는 것 같습니다.
class TransactionsController < ApplicationController
before_action :set_transaction, only: [:show, :edit, :update, :destroy]
def index
@report = Report.find(params[:report_id])
@transaction = @report.transactions
Rails.logger.info("********* report #{@report.inspect} ***********")
@transactions = @report.transactions
Rails.logger.info("********* transaction #{@transactions.inspect} ***********")
end
내 경로
resources :reports do
resources :transactions
end
'field : Transactions, type : Array'는 Mongoid에게'Transactions' 필드가 있음을 알리며,'embeds_many : transactions'는 Mongoid에게 해시이고 그 원소가 감싸 져 있어야하는'transactions' 배열이 있어야한다고 알려줍니다 트랜잭션 (Transaction) 객체에 저장됩니다. 모든 것은 대소 문자를 구분합니다. BTW는 API가 JSON을 제공한다고해서 응용 프로그램에 더 잘 맞게 재배치하거나 이름을 바꿀 수 없으며 재사용 할 수 없다는 것을 의미하지는 않습니다. –
위의 코드를 기반으로 트랜잭션의 가치를 어떻게 얻을 수 있습니까? 예를 들어 보고서의 특정 트랜잭션에 대한 "transactionType"입니다. Rails가 내 보고서가 보고서 개체라는 것을 알 수 있습니다. 내 트랜잭션이 트랜잭션 개체라는 것을 알지 못합니다.나는 내가 95 %라고 생각하고 끝 부분에 도달 할 수 없다. – ducati1212
좋아, 나는 네 게시물을 기반으로 돌아가서 내 사건을 정리했다. 트랜잭션을 사용하여 소문자로 변환했습니다. 지금 트랜잭션을 사용하고 있습니다. 나는 레일스 컨벤션을 따르고 있다고 생각했지만 분명히 내 물건을 섞어 놓고 있었다. 모든 "embeds_many : transactions"를 embeds_many : Transactions로 변경했습니다. "Thanks – ducati1212