使用MongoID嵌入式文档的Rails没有映射到我的模型

时间:2016-12-11 18:56:27

标签: ruby-on-rails mongoid

这可能是我的一个问题,我一直在努力通过一些Rails和mongo样本来加快速度(这都是为了学习而不是为了工作。)这个当前的项目我从api和我得到一个JSON字符串把它放在mongo中。因此,改变文档结构并不是一种选择。然后我一直在尝试将其映射到Rails模型中,以便我可以使用数据。

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]"
    },

我有一个报表模型和一个事务模型(我将在一次执行1之后执行LogLines)我的报表模型没问题我可以根据ID获取单个报表文档并返回报表。然后,我可以执行“report.transactions”并获取事务的json blob(几乎总是在报表中的多个事务)但是它不被识别为事务模型(将在下面发布所有代码)所以我不能说transaction.InfoPlate I得到一个没有这样的方法错误。我在我的模型中有关系,但我也有一个“字段:事务,类型:数组”,在查看mongoid上的轨道时,不在theres中。没有它,我什么都没得到,所以关系“embeds_many:transactions”不允许我获得report.transaction。对不起,如果这让我感到困惑,我的Rails术语很低。简短和汗水我想得到一份报告,然后获得交易,并能够做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字符串而不是ruby模型。或者至少我不能调用像@ transaction.colId这样的东西。只是没有返回这样的方法。事务是一个数组有很多,所以我尝试了transactions.first.InfoPlate,但仍然对我来说似乎Rails似乎是作为一个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

1 个答案:

答案 0 :(得分:0)

上面的帖子让我重新参与并匹配我的所有案例,这似乎有效。