2016-12-11 3 views
0

이것은 일부 레일 및 몽고 샘플을 통해 속도를 높이기 위해 고심하고있는 부분 일 수 있습니다. 나는 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 
+0

'field : Transactions, type : Array'는 Mongoid에게'Transactions' 필드가 있음을 알리며,'embeds_many : transactions'는 Mongoid에게 해시이고 그 원소가 감싸 져 있어야하는'transactions' 배열이 있어야한다고 알려줍니다 트랜잭션 (Transaction) 객체에 저장됩니다. 모든 것은 대소 문자를 구분합니다. BTW는 API가 JSON을 제공한다고해서 응용 프로그램에 더 잘 맞게 재배치하거나 이름을 바꿀 수 없으며 재사용 할 수 없다는 것을 의미하지는 않습니다. –

+0

위의 코드를 기반으로 트랜잭션의 가치를 어떻게 얻을 수 있습니까? 예를 들어 보고서의 특정 트랜잭션에 대한 "transactionType"입니다. Rails가 내 보고서가 보고서 개체라는 것을 알 수 있습니다. 내 트랜잭션이 트랜잭션 개체라는 것을 알지 못합니다.나는 내가 95 %라고 생각하고 끝 부분에 도달 할 수 없다. – ducati1212

+0

좋아, 나는 네 게시물을 기반으로 돌아가서 내 사건을 정리했다. 트랜잭션을 사용하여 소문자로 변환했습니다. 지금 트랜잭션을 사용하고 있습니다. 나는 레일스 컨벤션을 따르고 있다고 생각했지만 분명히 내 물건을 섞어 놓고 있었다. 모든 "embeds_many : transactions"를 embeds_many : Transactions로 변경했습니다. "Thanks – ducati1212

답변

0

위의 게시물은 나를 다시 가서 내 모든 경우에 맞게 만들어 그 작동하는 것 같군.