jjzjj

Cesium 核心概念 核心接口

CodeDoraemon 2025-02-19 原文

Cesimum 可以做什么

Cesium 是一个开源的3D地球可视化引擎,它可以在Web浏览器中以高性能和高质量呈现全球范围内的地球表面数据。

Cesium 可以用于以下领域:

地理信息系统:Cesium 可以呈现地球表面上的各种地理信息数据,包括卫星影像、数字高程模型、地形数据、矢量数据等。用户可以使用 Cesium 创建交互式的地图应用程序,从而更好地了解地球上的各种地理信息。

智能城市:Cesium 可以用于可视化城市规划、交通流量、气象预报、环境监测等数据。通过 Cesium,用户可以更好地了解城市的运转情况,并对城市的规划、管理等方面进行决策。

航空航天:Cesium 可以呈现卫星轨道、星座分布、航空交通等数据,用户可以使用 Cesium 创建航空航天应用程序,更好地了解地球上的各种航空航天信息。

教育和科普:Cesium 可以呈现地球上的各种自然现象、历史事件、文化遗产等信息,用户可以使用 Cesium 创建科普应用程序,更好地向公众传播知识和文化。

总之,Cesium 可以用于各种需要可视化地球表面数据的领域,为用户提供高质量、高性能的3D地球可视化服务。

Cesium 可以加载的数据

Cesium可以加载全球范围的地图数据,包括地形、影像、矢量数据等。Cesium支持的地图数据格式包括:

影像数据格式:JPEG、PNG、GIF、BMP、TIFF、DDS等
地形数据格式:STL、glTF、3D Tiles、CZML等
矢量数据格式:GeoJSON、KML、TopoJSON等
可以使用Cesium提供的数据加载器加载上述格式的数据,并在地球上进行可视化展示。同时,Cesium也支持自定义数据源,开发者可以根据自己的需求开发自己的数据源,并加载到Cesium中进行展示。

加载矢量以及几个数据


Cesium 可以使得数据动态的展示

Cesium 前后端架构以及部分核心类

Cesium 图层编辑的接口或者工具

Cesium提供了一些内置的类和工具,可以用来进行图层编辑,包括:

Cesium.DrawHandler:提供了用鼠标绘制几何图形的功能,包括点、线、多边形等,可以通过监听事件来获取绘制结果。

Cesium.Primitive:原生图元对象,可以进行图元的创建、更新、删除等操作,支持的图元类型包括点、线、面、贴图等。

Cesium.Entity:实体对象,可以用来表示一个物体或者一个事件,支持的属性包括位置、方向、外观、动态效果等。

Cesium.DataSource:数据源对象,可以用来加载各种格式的数据文件,并且提供了对数据的编辑和更新功能。

Cesium.Cesium3DTileset:3D Tiles数据源对象,提供了对3D Tiles数据的加载和编辑功能。

除了以上的内置类和工具,Cesium还提供了很多插件和第三方工具,可以用来进行更加复杂的图层编辑和管理。

Cesium提供了大量的插件和第三方工具,用于进行更加复杂的图层编辑和管理。以下是其中一些常用的插件和工具:

Cesium Widget:Cesium Widget是一个开源的WebGL渲染引擎,可以用于创建高性能的地图应用程序。它提供了各种各样的功能,例如地图导航、图层管理、数据可视化等等。

Cesium Ion:Cesium Ion是Cesium提供的一个云服务平台,可以用于管理地图数据、进行3D模型构建和发布等等。它提供了各种各样的工具和API,用于快速创建和部署地图应用程序。

Cesium Terrain Builder:Cesium Terrain Builder是一个用于生成地形数据的工具,可以将现有的DEM数据转换为Cesium所支持的地形格式。它支持各种各样的DEM数据源,并且可以生成不同分辨率的地形数据,以适应不同的场景。

Cesium Inspector:Cesium Inspector是Cesium提供的一个调试工具,可以用于检查和调试场景中的各种元素。它提供了各种各样的功能,例如查看场景中的对象属性、修改对象状态、以及调整相机位置等等。

Cesium Stories:Cesium Stories是Cesium提供的一个可视化故事创建工具,可以用于创建交互式的地图故事。它支持各种各样的地图元素、文本和多媒体内容,并且可以创建不同的故事场景,以提供更加丰富的用户体验。

CesiumJS Offscreen:CesiumJS Offscreen是一个用于在Web Worker中进行Cesium渲染的工具,可以提高场景渲染性能。它提供了各种各样的API,用于创建、配置和管理Web Worker,并且支持多线程渲染,以进一步提高性能。

这些插件和工具提供了丰富的功能和API,可以帮助开发人员快速创建和部署复杂的地图应用程序,并且提高应用程序的性能和用户体验。

Cesium 量测功能的实现 API

Cesium提供了许多内置的API或者工具,可以用来进行长度、面积、体积等的量测。下面是其中一些:

Cesium.Measure:通过这个API可以创建测量对象,对地球上的距离、面积和高度进行测量。它提供了丰富的测量选项和自定义标记选项。

Cesium.MeasureTool:这是一个基于Cesium.MeasureAPI的工具,提供了更多的交互式测量选项,包括测量线、多边形、矩形、圆和高程等。

Cesium.VolumeTool:这是一个基于Cesium.MeasureAPI的工具,用于测量三维空间中的体积。它提供了多种形状的体积测量选项,包括球体、长方体、圆柱体和多面体。

Cesium.DistanceDisplayCondition:这个API可以用来控制对象的可见性,当对象距离相机的距离超出指定范围时,对象将不再显示。这个API可以用来进行距离测量,例如显示线段的长度。

Cesium.PolylineDashMaterialProperty:这个API可以用来创建虚线样式的线段材质。通过控制虚线的间隔和宽度,可以用来表示距离。

Cesium.PolygonOutlineGeometry:这个API可以用来创建多边形边框的几何体。通过计算多边形的边界,可以用来表示面积。

这些API和工具都提供了丰富的选项和自定义功能,可以用来满足各种不同的需求。

Cesium 对图层进行管理的 API 或者工具

Cesium提供了多种对图层进行管理的API和工具,包括但不限于以下几种:

CesiumLayer: Cesium原生的图层管理类,可以对图层进行添加、删除、显示、隐藏等操作。

Cesium3DTileset: Cesium的3D Tiles图层管理类,可以对3D Tiles图层进行加载、显示、隐藏等操作。

GeoJsonDataSource: Cesium的GeoJSON数据源管理类,可以对GeoJSON数据源进行加载、显示、隐藏等操作。

KmlDataSource: Cesium的KML数据源管理类,可以对KML数据源进行加载、显示、隐藏等操作。

ImageryLayer: Cesium的影像图层管理类,可以对影像图层进行添加、删除、显示、隐藏等操作。

TerrainProvider: Cesium的地形图层管理类,可以对地形图层进行加载、显示、隐藏等操作。

Viewer: Cesium的场景管理类,可以对整个场景进行管理,包括添加、删除、显示、隐藏、切换等操作。

DataSourceCollection: Cesium的数据源集合管理类,可以对多个数据源进行集中管理,包括添加、删除、显示、隐藏等操作。

EntityCollection: Cesium的实体集合管理类,可以对多个实体进行集中管理,包括添加、删除、显示、隐藏等操作。

其他对图层进行管理的工具

Cesium Inspector:一个基于浏览器的工具,可帮助您检查和调试 Cesium 场景。它提供了一个用户友好的界面,可让您查看图层的属性和状态,如位置,缩放,旋转等。您可以通过单击场景中的任何对象来选择它,并查看其属性。

Cesium Ion:一个基于云的平台,可用于存储和管理地理空间数据,并轻松构建和部署 Cesium 场景。它提供了一个用户友好的界面,可让您上传和下载数据,以及管理场景的属性和设置。

Cesium Terrain Builder:一个开源的工具,用于将高程数据转换为 Cesium 场景中的地形图层。它支持各种高程数据格式,如 SRTM,DTED 和 GeoTIFF,并可用于创建不同精度的地形图层,从而提供不同的性能和视觉效果。

Cesium OSM Buildings:一个基于 OpenStreetMap 数据的开源工具,用于在 Cesium 场景中生成建筑物图层。它支持各种建筑物类型和风格,如高层建筑,住宅建筑和历史建筑,并可用于创建不同级别的详细程度。

Cesium 3D Tiles Styling:一个开源的工具,用于创建和编辑 Cesium 3D Tiles 图层的样式。它提供了一组用户友好的界面,可让您定义图层的样式属性,如颜色,透明度,纹理等,从而实现各种视觉效果和交互。

Cesium Vector Tile Inspector:一个开源的工具,用于检查和调试 Cesium 矢量瓦片图层。它提供了一个用户友好的界面,可让您查看和编辑矢量要素的属性和样式,如颜色,符号,标签等,从而实现各种地图效果和分析。

Cesium 的核心接口

Cesium的核心接口是Viewer,
它是一个场景视图的容器,
用于展示3D场景和处理用户交互。通过Viewer,我们可以添加图层、模型、绘制几何图形等,并且可以对场景进行视角操作、动画效果等。除了Viewer,Cesium还有一些其他核心接口和类,如Scene、Camera、Entity、Primitive等,它们各自负责不同的功能,一起构成了Cesium的完整框架。

Cesium 加载地形数据接口


创建一个椭球体

Cesium Camera

setView

flyTo

地区缓慢的移动到需要去的位置

获取到任意视角下面的三个可以调整相机参数的技巧
首先在 Cesium 地球中找到自己想要去的地方以及调节好视角,
然后再 F12 调试代码中设置相机的参数,就可以到达相应的地方

接口 - Cesium Viewer

示例代码

var viewer = new Cesium.Viewer('cesiumContainer', {
    imageryProvider: new Cesium.createOpenStreetMapImageryProvider({
        url: 'https://a.tile.openstreetmap.org/'
    }),
    baseLayerPicker: false,
    animation: false,
    timeline: false,
    geocoder: false
}); 

接口中参数含义

这个代码中创建了一个 Cesium.Viewer 对象,其中的参数如下:

‘cesiumContainer’:用于存放地球对象的 HTML 元素的 ID。

imageryProvider:图像提供者对象,它定义了从哪里获取地球表面的影像。这里使用的是 Cesium.createOpenStreetMapImageryProvider 方法,创建了一个 OpenStreetMap 影像提供者对象。

baseLayerPicker:是否显示切换底图图层的工具栏。这里设置为 false,不显示该工具栏。

animation:是否显示动画工具栏。这里设置为 false,不显示该工具栏。
timeline:是否显示时间线工具栏。这里设置为 false,不显示该工具栏。
geocoder:是否显示地理编码工具栏。这里设置为 false,不显示该工具栏。

接口 - Cesium Camera

Cesium的Camera是一个用于控制场景中相机位置、朝向和视角的对象。可以使用Camera来设置场景中的视图,例如更改相机高度、方位、角度和扭曲,以及添加相机移动动画等。

示例代码

lookAt:

lookAt(target, offset)

在观察者方向上以目标点为中心设置相机位置,并将相机朝向目标。target参数为三维坐标点,表示相机朝向的目标点。offset参数为三维向量,表示相机距离目标点的距离和相机的高度。

viewer.camera.lookAt(Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), new Cesium.Cartesian3(0, -3000, 2000));

setView:

setView(options)

设置相机的位置、方向和视角。options为一个对象,包含以下参数:

destination: 相机的目标位置(三维坐标点)。
orientation: 相机的朝向(四元数)。
endTransform: 相机移动到目标位置时的过渡方式(可选参数)。

viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 5000),
    orientation: {
        heading: Cesium.Math.toRadians(180),
        pitch: Cesium.Math.toRadians(-35),
        roll: 0.0
    }
});

flyTo:

flyTo(options)

通过一个过渡动画将相机从当前位置移动到指定的位置和方向。options为一个对象,包含以下参数:

destination: 相机的目标位置(三维坐标点)。
orientation: 相机的朝向(四元数)。
duration: 动画持续时间(单位为秒)。
complete: 动画结束后的回调函数(可选参数)。

viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 5000),
    orientation: {
        heading: Cesium.Math.toRadians(180),
        pitch: Cesium.Math.toRadians(-35),
        roll: 0.0
    },
    duration: 3,
    complete: function() {
        console.log("Camera flyTo completed!");
    }
});

setViewRectangle

setViewRectangle(rectangle, [ellipsoid], [duration])

根据指定的矩形调整相机位置和方向。该方法会使相机覆盖矩形区域并将相机的方向调整为与矩形的中心点对齐。rectangle为矩形区域对象,包含以下参数:

west: 矩形的西边界(单位为弧度)。

camara 代码示例

// 创建一个场景
var viewer = new Cesium.Viewer('cesiumContainer');

// 获取场景中的相机
var camera = viewer.camera;

// 设置相机的位置、朝向和视野范围
camera.position = new Cesium.Cartesian3.fromDegrees(-74.01881302800248, 40.69114333714821, 1000);
camera.direction = Cesium.Cartesian3.normalize(new Cesium.Cartesian3(-1.0, 0.0, -1.0), new Cesium.Cartesian3());
camera.up = Cesium.Cartesian3.normalize(new Cesium.Cartesian3(-1.0, 0.0, 1.0), new Cesium.Cartesian3());
camera.frustum.fov = Cesium.Math.PI_OVER_THREE;
camera.frustum.near = 1.0;
camera.frustum.far = 2000.0;

// 创建一个实体
var entity = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(-74.01881302800248, 40.69114333714821),
    model: {
        uri: 'https://assets.cesium.com/088/088.glb'
    }
});

// 相机跟随实体
viewer.trackedEntity = entity;

// 在这个示例中,首先创建了一个场景,并获取场景中的相机对象。然后通过设置相机的位置、朝向和视野范围来控制

Cesium - DataSource

在 Cesium 中,DataSource 类是用来加载、管理和可视化各种数据源的类。它的 clock 属性是用来控制数据源中时间相关信息的。

clock 属性包含了当前时间、开始时间、结束时间等时间信息。对于支持时间的数据源,Cesium 可以根据 clock 属性的设置来控制数据在时间上的展示。例如,可以设置数据随着时间变化而动态展示,或者只展示某个特定时间段的数据。

在使用 DataSource 加载支持时间的数据时,可以通过设置 clock 属性来控制数据在时间上的展示。下面是一个使用 clock 属性的示例代码:

var dataSource = new Cesium.KmlDataSource();
dataSource.load('example.kml').then(function() {
    viewer.dataSources.add(dataSource);
    var clock = viewer.clock;
    clock.startTime = dataSource.clock.startTime;
    clock.stopTime = dataSource.clock.stopTime;
    clock.currentTime = dataSource.clock.startTime;
    clock.clockRange = Cesium.ClockRange.LOOP_STOP;
    clock.multiplier = 10;
});

在这个示例代码中,我们先加载了一个 KML 文件,然后将其加入到了 viewer 对象中。接下来,我们从 dataSource 对象中获取了其 clock 属性,并将 clock 属性中的开始时间、结束时间、当前时间、时间范围和速率等信息设置到了 viewer 对象的 clock 属性中。这样就可以通过控制 viewer 对象的 clock 属性来控制数据在时间上的展示了。

这段代码涉及到 Cesium 的时间系统,clock.clockRange 和 clock.multiplier 是用来控制时间播放的方式和速度的属性。

clock.clockRange 是一个枚举类型,表示时间范围。LOOP_STOP 表示时间循环,当时间达到最大时间时,时间会重置到最小时间并继续循环。也就是说,当时间到达最大时间时,它不会停止,而是会回到最小时间,再次播放。

clock.multiplier 表示时间流逝的速度倍数。它的默认值是1,如果设置为2,则时间会以两倍的速度流逝。在这个例子中,将倍速设置为10,表示时间将以10倍速播放。

kml 数据

KML(Keyhole Markup Language)是一种用于描述地理信息的标记语言,由 Google 创造并推广。它是一种基于 XML 的格式,用于表示三维地球上的点、线、区域、图标、照片、文字标签以及其他地理信息。KML 数据可以被 Google 地球、Cesium 等软件解析和渲染,从而实现地理信息可视化和交互。KML 格式支持的标记种类非常多,包括图形、地名、地标、多媒体、网格、模型等,可以满足各种类型地理信息的表示需求。

shp 文件转换为 kml 文件

可以使用一些第三方工具或者脚本来将 shape 数据转换为 kml 数据。以下是一些常用的工具或脚本:

ArcGIS Desktop:ArcGIS Desktop 是一个商业 GIS 软件,支持将 shape 文件导出为 kml 文件。

ogr2ogr:ogr2ogr 是 GDAL/OGR 工具集中的一个命令行工具,支持将多种数据格式互相转换,包括将 shape 文件转换为 kml 文件。

shp2kml:shp2kml 是一个 Python 脚本,可以将 shape 文件转换为 kml 文件。它基于 Simplekml 库实现,可以生成包含点、线、面等各种要素的 kml 文件。

QGIS:QGIS 是一个开源的 GIS 软件,支持将 shape 文件导出为 kml 文件。在 QGIS 中,可以使用 “Save As” 功能将 shape 文件导出为 kml 文件。

需要注意的是,转换过程可能会因为数据的格式和内容而有所不同,因此建议根据具体情况选择合适的工具或脚本。

有关Cesium 核心概念 核心接口的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. ruby - 如何让 ruby​​-prof 忽略 Ruby 核心/标准库/gem 方法? - 2

    我是Ruby分析的新手,看起来像ruby-prof是一个受欢迎的选择。我刚刚安装了gem并调用了我的程序:ruby-prof./my-prog.rb但是,输出非常冗长,因为包含所有Ruby核心和标准库方法以及其他gem的分析数据。例如,前三行是:8.790.0110.0100.0000.0013343*String#%7.280.0780.0090.0000.0692068*Array#each4.930.0380.0060.0000.0321098*Array#map这对我来说不是什么有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且大概已经对这些类进行了优化。我只关心我代

  3. ruby-on-rails - 如何在 RubyOnRails 中使用 'acts as nested set' 创建一个可排序的接口(interface) - 2

    我一直在为使用acts_as_list的模型实现一些不错的交互界面,这些界面可以对我的mRails应用程序中的列表进行排序。我有一个排序函数,在每次拖放之后使用sortable_elementscript.aculo.us函数调用并设置每条记录的位置。这是在拖放完成后处理排序的Controller操作示例:defsortparams[:documents].each_with_indexdo|id,index|Document.update_all(['position=?',index+1],['id=?',id])endend现在我正在尝试对嵌套集模型(acts_as_nested

  4. Cesium源码解析一(terrain文件的加载、解析与渲染全过程梳理) - 2

    快速导航(持续更新中…)Cesium源码解析一(terrain文件的加载、解析与渲染全过程梳理)Cesium源码解析二(metadataAvailability的含义)Cesium源码解析三(metadata元数据拓展中行列号的分块规则解析)Cesium源码解析四(Quantized-Mesh(.terrain)格式文件在CesiumJS和UE中加载情况的对比)目录1.前言2.本篇的由来3.terrain文件的加载3.1更新环境3.2更新和执行渲染命令3.3数据优化3.4结束当前帧4.总结1.前言  目前市场上三维比较火的实现方案主要有两种,b/s的方案主要是Cesium,c/s的方案主要是u

  5. [面试直通版]操作系统核心之进程、线程与协程(下) - 2

    点击->操作系统复习的文章集目录操作系统线程线程是什么进程与线程的关系用户态/内核态操作系统资源管理内核态用户态内核态/用户态切换程序运行类型分析计算密集型IO密集型结合进程,线程来理解程序运行类型分析协程基础上下文切换协程协程为什么叫协作式线程?协程的优缺点操作系统线程典型问题:简述进程和线程的区别以下内容带您一步步了解线程是什么比进程更小的独立运行的基本单位-线程(Threads)线程的提出主要是为了提高系统内程序并发执行的程度,从而进一步提升系统的吞吐量,充分发挥多核CPU的优越性而设计的引入进程是为了操作系统更加方便地管理程序,使得多个程序能并发管理和执行而线程则是为了减少程序在并发执

  6. 你真正了解什么是接口测试么?接口实战一“篇”入魂 - 2

    最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,

  7. WebSocket的那些事(1-概念篇) - 2

    目录一、什么是Websocket二、WebSocket部分header介绍三、HTTPVSWebSocket四、什么时候使用WebSockets五、关于SockJS和STOMP一、什么是Websocket根据RFC6455标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。Websocket交互始于HTTP请求,该请求会通过HTTPUpgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:GET/spring-websocket-portfoli

  8. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  9. 半个月狂飙1000亿,ChatGPT概念股凭什么? - 2

    ChatGPT掀起了AI股历史上最疯狂的一轮市值狂飙。自春节后至今,ChatGPT概念股开始了暴走模式,短短半月时间,海天瑞声、开普云等ChatGPT概念股市值累计增加了近1400亿。如此的爆炸效应,得益于ChatGPT所展现出商业化落地的巨大潜力。要知道,在此之前,无论是十年AI投入超千亿的百度,还是困在硬件化里的AI四小龙,都在重复着AI商业化难落地的故事。ChatGPT的出现,让AI从生产力的赋能者直接成为一种创造生产力的工具。随着订阅模式的推出,ChatGPT已经成为第一个以AI技术为核心直接变现的消费者应用。本文持有以下核心观点:1、ChatGPT是AI技术迭代的受益者。过去受限技术

  10. ruby-on-rails - 在 Ruby on Rails 中为由外部 API 支持的模型使用 ActiveRecord 接口(interface) - 2

    我正在尝试在我的Rails应用程序中使用模型来从外部API检索信息。我想做的是以类似于ActiveRecord模型提供的方式(特别是关联,以及相同风格的可链接查询方法)访问我的数据模型(可能包含来自多个API调用的信息)。我最初的直觉是重新创建我想要的ActiveRecord部分并合并此API。不想“重新发明轮子”并确切地看到添加更多功能需要多少工作让我退后一步并重新评估如何处理这个问题。我找到了在没有表的情况下使用ActiveRecord的方法(请参阅:Railscast#193TablelessModel和博客文章here)并研究了ActiveRecord。因为ActiveMode

随机推荐