以下模型通过belongs_to链接:

require 'mongoid'
class Sensor
    include Mongoid::Document
    field :sensor_id, type: String
    validates_uniqueness_of :sensor_id
end


require 'mongoid'
require_relative 'sensor.rb'
class SensorData
    include Mongoid::Document
    belongs_to :sensor
    field :date, type: Date
    field :ozonMax1h, type: Float
    field :ozonMax8hMittel, type: Float
    index({ date: 1, sensor_id: 1 }, { unique: true })
end

下面是一个sinatra应用程序,它基于这些模型提供了一些api路径:
require 'sinatra'
require 'csv'
require_relative './models/sensor.rb'
require_relative './models/sensor_data.rb'

configure do
  Mongoid.load!('./mongoid.yml')
end

def prepare_for_export(sensor_data)
    converted_data = sensor_data.asc(:date).map do |e|
        {
            sensor_id: e.sensor.nil? ? :null : e.sensor.sensor_id,
            date: e.date,
            ozonMax1h: e.ozonMax1h,
            ozonMax8hMittel: e.ozonMax8hMittel
        }
    end
    converted_data
end

def convert_to_json(sensor_data)
    prepare_for_export(sensor_data).to_json
end

def convert_to_csv(sensor_data)
    data = prepare_for_export sensor_data
    csv_string = CSV.generate do |csv|
        csv << data.first.keys
        data.each do |hash|
            csv << hash.values
        end
    end
    csv_string
end

def get_recent
  max_date = SensorData.max(:date)
  SensorData.where(date: max_date)
end

def get_for_year(year)
  SensorData.where(:date.gte => Date.new(year, 1, 1)).where(:date.lte => Date.new(year, 12, 31))
end

def get_for_sensor(sensor)
  foo = SensorData.where(sensor_id: sensor)
  puts "hallo"
  return foo
end

get '/api/v1/stations' do
  content_type :json
  Sensor.all.map { |e| {sensor_id: e.sensor_id} }.to_json
end

get '/api/v1/sensordata/:year' do
  content_type :json
  convert_to_json get_for_year(params[:year].to_i)
end

get '/api/v1/sensordata/:year/csv' do
  convert_to_csv get_for_year(params[:year].to_i)
end

get '/api/v1/recent' do
  content_type :json
  convert_to_json get_recent
end

我想输出特定传感器的SensorData,例如:
/api/v1/stations/:sensor_id/sensordata/:year/csv

最佳答案

我不知道你想做什么,甚至不知道你是否还在寻找答案。你这里的例子中的模型似乎有问题。听起来,如果Sensor知道sensor_data的话,你正在做的事情可能会起作用。因此可能需要将其添加到Sensor类:

has_many :sensor_data

尽管数据的奇异性是数据。这个类应该是SensorDatum。如果你不能改变它,你需要告诉Mongoidclass_namehas_many中期望的SensorData实际上是foreign_key
您可以使用belongs_to在Mongoid中指定belongs_to
不能像使用activerecord那样使用belongs_to进行过滤,但是可以使用之外的作用域来获得相同的效果。Exampe:
belongs_to :sensor
scope :for_year, -> (year) { where(:date.gte => Date.new(2015,1,1)).where(:date.lte => Date.new(2015, 12, 31))}


belongs_to :sensor
def self.for_year year
  where(:date.gte => Date.new(year,1,1)).where(:date.lte => Date.new(year, 12, 31))
end

所以你的问题会变成这样:
sensor = Sensor.find_by(sensor_id: params[:sensor_id])
sensor.sensor_data.for_year(2015)

07-24 21:17