在Ruby / Rails中隔离数据访问层的最佳实践

时间:2011-02-18 15:59:32

标签: ruby-on-rails ruby ruby-on-rails-3 dao

所以,我有Ruby on Rails应用程序。现在空白。让我从一开始就说,我的大多数经验来自Java,所以我可能不会想到RoR开发者的做法。 : - )

我需要做的是创建一些数据访问层,比如它将是访问用户,所以就这样吧 UserDAO.rb基本上将使用ActiveRecord 直接访问数据库访问某些键值存储

从技术上讲,由于我们在Ruby中没有接口,我可以让UserDAO.rb“拥有”实现(基本上,我说的是组合),这可能是我们需要的任何东西,比如UserDAOActiveRecord.rb或UserDAOMongo .rb或其他类似的东西。 UserDAO.rb基本上会调用实现的方法,就是这样。应该很容易在实现之间切换。

虽然听起来像是一个可能的解决方案,但我很期待在Ruby世界中听到这个问题的最佳实践。谢谢!

3 个答案:

答案 0 :(得分:3)

您将不得不寻找除ActiveRecord之外的Ruby类(指出它是一个对象关系映射器,因此没有单独的数据访问层)。

您可能需要查看:http://sequel.rubyforge.org/

您可以创建一个类Person,其中包含使用Sequel实例与数据库通信的方法。

这个未经测试的代码说明了为什么这可能不是一个好主意:

class Person
  attr_reader :first_name, :last_name

  DataSource = Sequel.sqlite('my_app.db')[:people]

  def initialize(record)
    @first_name = record.first_name
    @last_name = record.last_name
  end

  # Find a record from the database and use it to initialize a new Person object 
  def self.find_by_id(id)
    self.new(Table.where(:id => id))
  end
end

答案 1 :(得分:2)

请记住,ActiveRecord不仅是一种访问数据库的方式,它还是您的数据如何集成到应用程序中的模式:每个模型控制自己的数据并根据需要存储/检索/查询它的想法,使用表示数据库行的模型实例。

当然,您不必使用该模式,但它是Rails的核心之一,因此通过将ActiveRecord视为另一种要抽象的数据访问方法,您将失去许多功能。

另请注意,ActiveRecord已经使用数据库适配器抽象出数据库类型,因此很容易在MySQL,Oracle等中删除。但它确实假设了一个关系数据库。

但是,要回答您的问题,并不是真的有必要将数据访问实现包装在另一个类中,以确保一致的接口。正如你所说,ruby没有Java类型的接口,但ruby世界通常也不会试图确保开发人员只能做合法的事情。您可以创建一组数据访问类,这些类提供相同的方法集,创建单元测试以确保这些方法是一致的(并充当这些方法的可执行文档),然后相信开发人员可以针对哪一个进行正确的调用他们选择实施。它与Java世界有很大的文化差异,Java世界中的所有东西都被编码为接口,方法是最终的,对象是不可变的。需要一些时间来适应。

答案 2 :(得分:1)

Alex,我强烈建议您阅读Agile Web Devoplment With Rails一书(第4版)。 Active Record实现了......活动记录模式,因此Class是DAO(类方法代表dao),而实例方法代表对象。

例如,您可以拥有

person = Person.find(3)   //Person is the dao
person.name = 'mick'      //name = is the setter for he instance
person.save               // well.. saves the object

我用Java编写了10年的代码,刚开始使用ruby .....这是一个很大的变化。