我正在寻找更好的方式(也就是架构)来使用不同类型的数据库(MySQL + MongoDB)来跟踪相同的Rails应用程序。
我在推测一个主要的Rails 3.1应用程序,安装Rails 3.1引擎链接每个不同类型的数据库......
...或者有一个主要的Rails 3.0.x应用程序为每个MySQL / MongoDB提供一个sinatra端点......
你认为这可能......,任何想法或建议吗?
我在这里注意到其他一些类似的问题,但我认为“挂载应用程序”在Rails 3.1 / Rack / Sinatra中正在快速发展,我们都需要调整我们的范例。
提前致谢 Luca G. Soave
答案 0 :(得分:10)
通过运行两个应用程序只是为了拥有两种类型的数据库,不需要完全过度复杂化。听起来你需要DataMapper。它完全可以满足您的需求。获取dm-rails gem以将其与Rails集成。
在DataMapper中,与ActiveRecord不同,您必须提供有关底层数据存储的所有详细信息:它具有哪些字段,如何映射模型中的属性,表名称是什么(如果在数据库中),后端是什么它使用等等。
阅读文档......有一堆代码可以给你一个想法。
每个模型只是一个普通的旧Ruby对象。类定义只混合在DataMapper::Resource
中,这使您可以访问所有DataMapper功能:
class User
include DataMapper::Resource
property :id, Serial
property :username, String
property :password_hash, String
property :created_at, DateTime
end
但是你有很多控制权。例如,我可以指定此模型不存储在我的默认数据存储(存储库)中,并且存储在其他一个配置的数据存储中(如果您愿意,可以存储在NoSQL存储中)。
class User
include DataMapper::Resource
storage_names[:some_other_repo] = 'whatever'
# ... SNIP ...
end
大部分DM在类固醇上的行为与ActiveRecord相似。您可以获得所有基础知识,例如查找记录(除非您的模型将其抽象出去,否则您永远不必使用原始字段名称):
new_users = User.all(:created_at.gte => 1.week.ago)
你得到验证,你得到观察者,你得到集合处理......然后得到一堆其他的东西,比如战略急切加载(解决n + 1查询问题),延迟加载大文本/ blob字段,多个存储库支持。在我看来,查询逻辑比AR好得多。只需阅读文档即可。他们是人性化的。不仅仅是API参考。
有什么缺点?好吧,很多宝石都没有考虑到你可能没有使用ActiveRecord,所以当你需要一个宝石时,还需要做更多的搜索。随着时间的推移,这将变得更好,因为在Rails 3.x之前将DM与Rails无缝集成并不是那么容易。
答案 1 :(得分:4)
我不完全理解你的问题。比如
虽然我不是红宝石专家rails(几个月前拿起),我想在这里添加一些东西。
我目前正在后端使用mongo和MySQL构建rails应用程序。 Mongoid& ActiveRecord是驱动程序。用于交易的MySql和用于所有其他类型数据的mongo(主要是地理空间)。它只是直截了当。您可以创建继承mongoid和activerecord的不同模型。
class Item
include Mongoid::Document
field :name, :type => String
field :category, :type => String
end
和
class User < ActiveRecord::Base
end
你可以用同样的方式查询(除了复杂的sql连接,mongoid还有一些用于Geo空间查询的查询模式)
Item.where(:category => 'car').skip(0).limit(10)
User.where(:name => 'ram')
这是一件轻而易举的事。但是你需要知道一些重要的要点
Still Mongoid是一部伟大的作品。它的功能齐全。