所以,我有Ruby on Rails应用程序。现在空白。让我从一开始就说,我的大多数经验来自Java,所以我可能不会想到RoR开发者的做法。 : - )
我需要做的是创建一些数据访问层,比如它将是访问用户,所以就这样吧 UserDAO.rb基本上将使用ActiveRecord 或直接访问数据库或访问或某些键值存储或我能想到的任何其他事情。
从技术上讲,由于我们在Ruby中没有接口,我可以让UserDAO.rb“拥有”实现(基本上,我说的是组合),这可能是我们需要的任何东西,比如UserDAOActiveRecord.rb或UserDAOMongo .rb或其他类似的东西。 UserDAO.rb基本上会调用实现的方法,就是这样。应该很容易在实现之间切换。
虽然听起来像是一个可能的解决方案,但我很期待在Ruby世界中听到这个问题的最佳实践。谢谢!
答案 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 .....这是一个很大的变化。