我最近一直在使用 Sequelize.js,并且经常遇到术语“DAO”。来自 ActiveRecord(在 Rails 中),ORM 的想法似乎非常简单。
谁能给我解释一下 DAO 是什么?它与 ORM 有何不同?它如何导致更多模块化代码/防止抽象泄漏?
感觉/似乎 DAO 可以被认为是一个单一的“模型”——在 ActiveRecord 的上下文中,我的用户实例将被认为是一个 DAO,因为它:“抽象了实现远离应用程序的持久数据存储,并允许与其进行简单交互“?
最佳答案
这里有一些想法可能会帮助您理清思路。我对 ActiveRecord 比对 Sequelize 更熟悉,所以我会使用它,但两者的概念应该相同。
你有一个数据库。您可以完全独立于 Rails(例如,使用数据库管理工具),在该数据库上运行查询 - 类似于 "select * from users limit 1"。但这只会在某些管理窗口中为您提供一组结果,这对您的 Rails 应用程序用处不大。您希望能够从 Rails 应用程序执行 SQL,并以 Ruby/Rails 可以使用的形式取回数据。您需要通过某种 ruby 对象访问您的数据 - 您需要一个数据访问对象,或者DAO.
在 Rails 中,您可以使用类似以下内容运行上面的查询:
result = ActiveRecord::Base.connection.execute("select * from users limit 1")
result 变量不会知道或关心您的User 模型。它所包含的只是一个普通的 ruby Hash 实例列表,例如:
{
"id" => "1234",
"email" => "fred@example.com",
"first_name" => "Fred",
"last_name" => "Flintstone",
}
如果您想将 first_name 更新为 Bob,您不能只编辑该散列并在其上调用保存 - 它只是一个普通的旧散列,只是数据,没有额外的智慧。所以你必须再次编写自己的 SQL,并让 Rails 为你执行它:
ActiveRecord::Base.connection.execute("update users set first_name = 'Bob' where id = 1234")
所以您在此上下文中使用的基本上只是 Rail 的 DAO,而没有使用它的 ORM。
ORM 就像是 DAO 之上的一层。您可以拥有一个没有ORM 的DAO,但是您不能拥有一个没有DAO 的ORM。 ORM 或 Object Relational Mapper 将使用 Objects 使用您的编程语言(即 Ruby)。所以,如果你想做上面的事情,使用 Rail 的 Map Relational 数据库中的概念/记录ORM 而不是使用它的 DAO,它可能看起来像:
user = User.find(1234)
user.name = 'Bob'
user.save!
看看使用 ORM 有多好?现在,上面的代码片段使用 ORM,本质上仍然只是执行我们之前详述的相同 SQL。 ORM 只是抽象出更多的细节并提供更智能的对象来为我们节省大量额外的工作。
同样,展示的概念可以转移到 Sequelize/Javascript 和其他语言/框架。
所以 DAO 只是“一个可以执行 SQL 并以编程语言原生的一些基本数据结构返回结果的对象”。 ORM 最终将使用 DAO 与数据库进行通信,但在顶部提供了更多内容。
关于javascript - DAO 与 ORM - 在 Sequelize.js 的上下文中解释的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41495110/
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
如果我有以下一段Ruby代码:classBlahdefself.bleh@blih="Hello"@@bloh="World"endend@blih和@@bloh到底是什么?@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@@bloh是Blah的类Class中的一个变量? 最佳答案 人们似乎忽略了该方法是类方法。@blih将是常量Bleh的类Class实例的实例变量。因此:irb(main):001:0>classBlehirb(main):002:1>defself.blehirb
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f
我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong
我在Ruby程序中有两个URI。一个肯定是绝对URI,另一个可能是绝对URI或相对URI。我想在第一个的上下文中将第二个转换为绝对URI,所以如果第一个是http://pupeno.com/blog第二个是/about,结果应该是http://pupeno.com/about.有什么想法吗? 最佳答案 Ruby的内置URI和Addressablegem,做这个简短的工作。我更喜欢Addressable,因为它功能更全面,但URI是内置的。require'uri'URI.join('http://pupeno.com/blog','/
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan