加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在rails中管理数据库的两个快照

发布时间:2020-12-17 02:21:23 所属栏目:百科 来源:网络整理
导读:我们目前有一个rails应用程序(基本上是一个CRUD),用作移动应用程序的Web服务. 现在,当用户修改应用程序中的内容时,更改将在移动应用程序中生效,因为它们使用的是同一个数据库. 我们有什么方法可以将实时数据(由应用程序提取)与用户可以在CRUD中修改的数据分
我们目前有一个rails应用程序(基本上是一个CRUD),用作移动应用程序的Web服务.

现在,当用户修改应用程序中的内容时,更改将在移动应用程序中生效,因为它们使用的是同一个数据库.

我们有什么方法可以将实时数据(由应用程序提取)与用户可以在CRUD中修改的数据分开?我们可以使用DBMS功能,还是宝石?

我们目前正在使用MySQL,但我们正在积极寻找替代品(例如Postgresql).

编辑:我们决定在此期间使用文件系统缓存,为每个人提供非最新版本的内容.然后,当一切都好的时候我们继续失效,这样每个人都可以拥有最新的版本.但我不认为这是一个可靠的解决方案……

编辑2:这个问题的全部目的是我们想要控制移动应用程序读取的内容,某种适度.我们希望能够基本管理变更和不同的状态/版本/快照.

解决方法

如果我理解正确,这是你的问题:

>单个Rails应用程序处理来自移动应用程序的READ和WRITE请求
>您希望单个Rails应用程序使用不同的READ数据库和WRITE数据库
>并且您希望能够在WRITE传播到READ DB时进行自定义控制

解决问题最简洁的方法是:

创建两个数据库(让我们称之为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.

(要么)
>只运行一个Rails应用程序实例,只需在生产和生产数据库之间切换.由于您拥有适当的Web服务,我将假设您正在使用GET请求来读取数据.所有其他(POST / PUT / DELETE / etc)请求都是写请求.如果你不这样做,那么我首先建议你这样做.鉴于您正在使用GET进行读取,那么您将执行以下操作:

# 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 ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读