ruby-on-rails – 在rails中管理数据库的两个快照
我们目前有一个rails应用程序(基本上是一个CRUD),用作移动应用程序的Web服务.
现在,当用户修改应用程序中的内容时,更改将在移动应用程序中生效,因为它们使用的是同一个数据库. 我们有什么方法可以将实时数据(由应用程序提取)与用户可以在CRUD中修改的数据分开?我们可以使用DBMS功能,还是宝石? 我们目前正在使用MySQL,但我们正在积极寻找替代品(例如Postgresql). 编辑:我们决定在此期间使用文件系统缓存,为每个人提供非最新版本的内容.然后,当一切都好的时候我们继续失效,这样每个人都可以拥有最新的版本.但我不认为这是一个可靠的解决方案…… 编辑2:这个问题的全部目的是我们想要控制移动应用程序读取的内容,某种适度.我们希望能够基本管理变更和不同的状态/版本/快照. 解决方法
如果我理解正确,这是你的问题:
>单个Rails应用程序处理来自移动应用程序的READ和WRITE请求 解决问题最简洁的方法是: 创建两个数据库(让我们称之为READ DB和WRITE DB),并在它们之间设置主/从复制.因此,无论您在WRITE DB中进行何种查询,它都会在READ DB中进行复制,您可以控制何时以及如何触发复制.几乎每个数据库都支持这种开箱即用的功能.以下是MySQL的说明.您甚至不必为此切换到PostgreSQL,因为Mater / Slave复制是标准的并且在任何一个都是健壮的. 对于Rails应用程序,您现在将在config / database / yml中配置两个数据库: production: # configuration for your WRITE DB adapter: mysql database: ... host: ... username: ... password: ... production_read: # configuration for your READ DB adapter: mysql database: ... host: ... username: ... password: ... 然后你有两个选择: >部署两个相同的实例.代码没有变化,只是部署了两个实例,一个实例使用RAILS_ENV = production_read进行READ,另一个实例使用RAILS_ENV =生产进行WRITE.更改您的移动应用程序,以便READs转到第一个实例URL,而WRITE转到另一个实例URL. (要么) # app/controllers/application_controller.rb class ApplicationController before_filter do # Switch to production_read or production configurations # based on request method if request.get? ActiveRecord::Base.establish_connection "production_read" else ActiveRecord::Base.establish_connection "production" end end 这将根据请求方法在您的production_read和生产配置之间切换.您还可以订购before_filter,以便只有在您的身份验证和授权之后才会进行切换,最后它会在您的控制器逻辑之前发生. 有时也需要为所有模型类执行相同的establish_connection.因此,在这种情况下,您只需遍历ActiveRecord :: Base子类并调用相同的establish_connection逻辑.哎呀,你甚至可以在切换连接之前省略一些子类! ActiveRecord::Base.descendants.each do |model_class| model_class.establish_connection (request.get? ? "production_read" : "production") end # Or let's say you want to switch all models *except* User/Session models to the READ DB (ActiveRecord::Base.descendants - [User,Session]).each do ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |