首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Rails with Repository Pattern?

Ruby on Rails with Repository Pattern?
EN

Stack Overflow用户
提问于 2009-11-04 07:18:08
回答 5查看 7.2K关注 0票数 13

在使用Rails MVC之后,它让我想到了ASP.Net。我之前使用过Rails,但有点生疏。ASP.Net MVC教程重新注释了使用存储库模式隐藏数据层的实现。这为单元测试提供了简单的依赖注入,并很好地将控制器与模型实现解耦。

我记得Rails的控制器直接使用Active Record对象,单元测试使用测试数据库,可以很容易地设置和拆除。这解决了换出进行单元测试的需要,但在控制器中公开如此多的ActiveRecord代码似乎仍然不是一个好主意。

所以我的问题是,这里最新的最佳实践是什么?真实的(不是模拟的)数据库仍然用于单元测试吗?Rails开发人员是直接调用ActiveRecord,还是抽象调用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-04 18:51:39

我想知道,ActiveRecord真的构成了“数据层”吗?毕竟,它的目的是抽象(在相当合理的程度上)实际的交互存储。如果我有一个继承自ActiveRecord::Base的模型,并在控制器中引用该模型,我是否真的与数据层交互?

看一下Repository Pattern的简要描述,我会说find_by_的方法已经为您提供了它所描述的大部分内容,这很好,不是吗?好的,抽象层是漏洞百出的(人们可以更慷慨地说“实用”),因为如果需要,我们可以更接近金属,例如find_by_sql将很明显地表明,我们正在处理某种类型的关系数据库。

我建议永远不要(或者我应该说“很少而且不是没有极端的理由”-使用绝对的代码总是很棘手的),把代码放在控制器中,这样就可以推断正在使用的数据平台。所有这些都应该放到模型中去-- named_scope在这里非常有用。对于复杂的结果,可以考虑使用"presentation“对象作为接口(Struct和我个人最喜欢的OpenStruct在这里非常有用)。

虽然ActiveRecord是事实上的标准,但考虑到它与Rails一起安装,它并不是唯一的游戏。对于非SQL数据库,需要一些不同的东西,但即使在SQL域中也有Datamapper (它是基于eponymous PoEAA pattern的吗?)

在Rails3.0中,像Yehuda这样的ORM将变得容易得多,男孩们可以拆卸和清理接口。

票数 7
EN

Stack Overflow用户

发布于 2009-11-04 07:24:52

我的经验是,Ruby on Rails与ActiveRecord集成得如此紧密(在大多数情况下,它几乎可以变得完全透明),以至于开发人员经常在没有任何抽象的情况下使用它。

要记住的是,存储库模式和活动记录模式都是在Patterns of Enterprise Architecture by Martin Fowler中建议的(如果您还没有读过,yet...you应该这样做)。活动记录紧密集成在Rails中。Microsoft并不会将您与pattern...so捆绑在一起,大多数开发人员都采用了.NET模式。

票数 9
EN

Stack Overflow用户

发布于 2009-11-05 16:02:20

无论哪种方式,你都可以做到。大多数情况下,编写Rails功能测试的目的都是为了访问数据库,正如您所描述的那样,在数据库中,数据是从fixture填充的。

但模拟服务层调用的情况并不少见,例如:

代码语言:javascript
复制
User.expects(:find_by_id).with("1").returns(u);
get :show, :id=>"1"

..。或者类似的东西。事实上,我一直都在这样做,我控制着模型对象(或者也可以把它模仿出来)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1670785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档