首页
学习
活动
专区
圈层
工具
发布

大型项目如何选择ORM:Active Record 还是 Data Mappers

ActiveRecord 从面向对象的角度来说,将数据操作与数据持久化两个功能放一起违反了单一功能原则。回顾一下什么是单一功能原则?每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。...ActiveRecord上手非常快,业务逻辑和持久化逻辑在一个对象里一起解决,封装越好的框架持久化逻辑对编程人员越透明,程序员甚至不用知道底层数据库使用的是MySQL还是MongoDB。...这在ActiveRecord中很难做到。拿到持久化对象之后对数据的干预也会非常方便,例如MySQL表中的字段类型从枚举变成了int,在ActiveRecord中你需要查找所有代码,将该字段修正。...而Data Mappers只需要在持久化对象中做个替换。 看一个调用实例: 如何选择ORM 上面把ActiveRecord和Data Mappers都介绍清楚了,选择哪一个需要根据实际业务需求来。

2.8K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ActiveRecord入门教程:Ruby的ORM神器

    简化数据库操作 - 不用写原生SQL就能完成CRUD(创建、读取、更新、删除)操作数据验证变得超简单 - 内置了丰富的验证机制关联关系清晰直观 - has_many、belongs_to让复杂关系变得易于理解迁移系统让数据库结构管理变得轻松...# 返回false,因为缺少emailuser.errors.full_messages # 返回错误信息数组带验证的保存if user.save # 保存成功else # 保存失败,处理错误...的迁移系统让管理数据库结构变得轻松:```ruby创建迁移文件class CreateUsers ActiveRecord::Migration[6.1] def change create_table...关联对象的高效创建问题:如何高效地为关联对象创建新记录?...是Ruby世界中极其强大的ORM库,它让数据库操作变得优雅且高效。

    23410

    几种实用型Ruby Web开发框架介绍

    Nitro支持开发基于Model-View-Controller的应用,同时支持非MVC、php风格的应用开发。Nitro使用xhtml文件,并定制的Ruby标签作为模板系统。   ...Nitro还使用了它自己的持久层,名为Og(ObjectGraph)。Og允许arbitrary Ruby对象的序列化。...Og提供自动化数据库进化功能:当Ruby类变更后,Og会进行自动检测,同时改变对应的数据库。有些人总是会忘掉ActiveRecord的Migration功能。   ...Sinatra是基于最小化的DSL语法开发的,它的小型基础核心中不包括诸如ActiveRecord这样的模块。通过使用get/post action定义,Sinatra具备动态路由定义功能。...API实现、快速的最小化应用以及那些不需要Rails中的功能(比如ActiveRecord)的web应用开发。可以用来对面板最小应用进行控制,或者是widget。

    3.5K00

    mybatis-plus思维导图,让mybatis-plus不再难懂

    mybatis-plus与mybatis #####mybatis  Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。...[回顾mybatis的特点.png] 但mybatis有个让我比较头疼的一个问题是sql工作量很大,尤其是字段多的时候。...如何集成mybatis-plus快速搭建一个spring boot项目。...常用实体注解 MP通过ORM模式封装了常用的CRUD操作,自然少不了实体注解,先来看看都有哪些注解 [MP常用实体注解.png] 其中实体无注解化设置可以如下处理: 当数据库的表字段名是驼峰命名时无需注解处理...:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 2 #字段策略 0:"忽略判断",1:"非

    4.3K180

    Rails框架流行在他的设计理念

    这两天看了一本书《Grails权威指南》,看了这个Java上Rails框架,其中有两条设计理念: 1、make simple thing easy and make complex possible -让简单的事情变的容易...,同时让复杂的事情的实现成为可能。...你要用这两个开发web框架,就一定要按他的方式做,model文件就放在models目录里,controller,view,helper分别放在特定名称的目录里,只要你按这个规则做了,那一切很简单,如果你较真抬杠非不这么放...SubSonic项目和Castle的ActiveRecord的子项目,由于.net静态语言的原因,在动态特性的实现上没有RoR中那么灵活,它基于.net中的attribute来标识字段和关系,SubSonic...他们的设计模式都是ActiveRecord,ActiveRecord做CRUD很简单,每个对象可以有自己的Fetch,FetchByxxx方法,从开发者的角度看这些对象,它们知道如何加载和保存自己,对象自己来维护

    3K50

    如何在Ubuntu 14.04上使用Puma和Nginx部署Rails应用程序

    你可能需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。...云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。...将生产密码和机密保存在应用程序代码库之外被认为是最佳实践,因为如果您使用的是分布式版本控制系统(如Git),它们很容易暴露出来。接下来我们将讨论如何使用环境变量设置数据库身份验证。 保存并退出。...变量(用你的应用程序名称替换突出显示的“APPNAME”,用生产数据库用户密码替换“prod_db_pass”): APPNAME_DATABASE_PASSWORD=prod_db_pass 保存并退出...rescue ActiveRecord::ConnectionNotEstablished ActiveRecord::Base.establish_connection(YAML.load_file

    8.2K10

    如何从 MongoDB 迁移到 MySQL

    数据的预处理 在进行迁移之前要做很多准备工作,第一件事情是要把所有嵌入的数据结构改成非嵌入式的数据结构: ?...mongoid-enum 使用字符串和 _status 来保存枚举类型的字段,而 ActiveRecord 使用整数和 status 表示枚举类型,两者在底层数据结构的存储上有一些不同,我们会在之后的迁移脚本中解决这个问题...如果在项目中使用了很多 Mongoid 的插件,由于其实现不同,我们也只能根据不同的插件的具体实现来决定如何对其进行迁移,如果使用了一些支持特殊功能的插件可能很难在 ActiveRecord 中找到对应的支持...在初始化 RelationBuilder 时,如果我们传入了 constants,那么在调用 RelationBuilder#build!...创建的中间类,我们会在下一节中介绍如何单独处理多对多关系: ?

    7.5K52

    Script(二)

    06 — Persistent Data 可以将持久数据块视为持久全局缓冲区。可以定义、重新定义、读取和清除持久数据块,并在所有打开的场景中共享这些数据块。...它们会一直保存到模拟器结束,但也可以保存在文件中,并在下一次V-REP启动时自动重新加载。...通过启用环境对话框中的可视化无线发射和可视化无线接收项,可以可视化无线发射/接收活动。下图展示了两个移动机器人之间的可视化无线通信: ?...下面的代码部分演示了一个线程的子脚本如何获取网页: ? 注意request命令的阻塞部分是如何放在非阻塞部分中的。...如果你的应用程序需要套接字通信,这是非常方便的设置一个线程脚本作为请求服务器,并让其他脚本访问它的套接字通信如下例: 线程请求服务器: ? 下面的非线程子脚本的例子可以用来访问套接字信息: ?

    1.6K10

    总结Web应用中常用的各种Cache

    解决这个问题的方法很简单,将用户相关的变量也加入到etag的计算里面: fresh_when :etag => [@article.cache_key, current_user.id] fresh_when...动态请求静态文件化 在rails请求完成以后,将结果保存成静态文件,后续请求就会直接由nginx提供静态文件内容,用after_filter来实现一下: class CategoriesController...静态化到集中缓存服务 首先我们得让Nginx有直接访问缓存的能力: upstream redis { server redis_server_ip:6379; } upstream...end 再比如说对于非登陆用户,我们可以缓存首页: class HomeController caches_action :index, :expires_in => 3.hours, :if =...class User ActiveRecord::Base acts_as_cached(:version => 1, :expires_in => 1.week)end#还是使用find方法,

    6.2K40

    GenshinPlayerQuery_qeriuwjhrf

    many to many 关联 QDB_ActiveRecord_Meta QDB_ActiveRecord_Meta 类封装了 QDB_ActiveRecord_Abstract 继承类的元信息 QDB_ActiveRecord_View...类封装了 QDB_ActiveRecord_View 继承类的元信息 QDB_ActiveRecord_Callbacks QDB_ActiveRecord_Callbacks 定义了 ActiveRecord...扩展来缓存数据 QCache_Memory QCache_Memory 在当次请求中使用内存来缓存数据 QCache_PHPDataFile QCache_PHPDataFile 类以 .php 文件来保存...PHP 的变量内容 QCache_XCache QCache_XCache 类使用 XCache 扩展来缓存数据 包 – webcontrols WebControls 是用户界面组件化的核心架构。...主要特征: 用户界面组件化 支持自定义控件 支持控件的无线级嵌套 附带的标准控件 与 QForm 的完美集成 QUI_Control_Abstract QUI_Control_Abstract 是用户界面控件的基础类

    2.2K20

    php之php.ini配置文件讲解案例

    ; 注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!...; 这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护。 disable_functions =  ; 这条指示让你可以为了安全的原因让特定函数失效。 ...(如:基于未初始化的变量自动初始化为一个  ;空字符串的事实而使用一个未初始化的变量) ; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误  ; E_CORE_WARNING -...发生于PHP启动时初始化过程中的警告(非致命性错)  ; E_COMPILE_ERROR - 编译时致命性错  ; E_COMPILE_WARNING - 编译时警告(非致命性错)  ; E_USER_ERROR...register_globals = On ; 是否将这些 EGPCS 变量注册为全局变量。  ; 若你不想让用户数据不在全局范围内混乱的话,你可能想关闭它。

    2K00

    一份热乎乎的字节面试真题

    Redis有几种持久化方式 Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。...Redis提供了RDB和AOF两种持久化机制,它持久化文件加载流程如下: 3.1 RDB RDB,就是把内存数据以快照的形式保存到磁盘上。 什么是快照?...可以这样理解,给当前时刻的数据,拍一张照片,然后保存下来。 RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。...Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。...Redis提供了RDB和AOF两种持久化机制,它持久化文件加载流程如下: 11.1 RDB RDB,就是把内存数据以快照的形式保存到磁盘上。 什么是快照?

    1.2K40

    PHP配置文件详解php.ini

    ; 注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!...; 这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护。 disable_functions = ; 这条指示让你可以为了安全的原因让特定函数失效。...(如:基于未初始化的变量自动初始化为一个 ;空字符串的事实而使用一个未初始化的变量) ; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误 ; E_CORE_WARNING -...发生于PHP启动时初始化过程中的警告(非致命性错) ; E_COMPILE_ERROR - 编译时致命性错 ; E_COMPILE_WARNING - 编译时警告(非致命性错) ; E_USER_ERROR...register_globals = On ; 是否将这些 EGPCS 变量注册为全局变量。 ; 若你不想让用户数据不在全局范围内混乱的话,你可能想关闭它。

    2.5K10

    PHP 配置文件详解(php.ini 详解 )

    注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!...这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护。 disable_functions = 这条指示让你可以为了安全的原因让特定函数失效。...(如:基于未初始化的变量自动初始化为一个 ;空字符串的事实而使用一个未初始化的变量) ; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误 ; E_CORE_WARNING -...发生于PHP启动时初始化过程中的警告(非致命性错) ; E_COMPILE_ERROR - 编译时致命性错 ; E_COMPILE_WARNING - 编译时警告(非致命性错) ; E_USER_ERROR...register_globals = On ; 是否将这些 EGPCS 变量注册为全局变量。 ; 若你不想让用户数据不在全局范围内混乱的话,你可能想关闭它。

    5.1K30
    领券