如何在相同的 Rails 应用程序之间序列化和通信 ActiveRecord 实例?

Bla*_*ere 5 ruby serialization json ruby-on-rails

主要思想是我有一个 Rails 应用程序的几个工作实例,然后是一个主要聚合

我想用下面的伪伪代码来做这样的事情

posts = Post.all.to_json( :include => { :comments => { :include => :blah } })
# send data to another, identical, exactly the same Rails app

# ...
# Fast forward to the separate but identical Rails app:
# ...

# remote_posts is the posts results from the first Rails app
posts = JSON.parse(remote_posts)  
posts.each do |post|
  p = Post.new
  p = post
  p.save
end
Run Code Online (Sandbox Code Playgroud)

我回避使用活动资源,因为我有数千条记录要创建,这意味着每条记录有数千个请求。除非有一种方法可以通过简单的活动资源在一个请求中完成所有操作,否则我想避免使用它。

  • 格式并不重要。只要方便就行。
  • 不需要发送 ID,因为其他应用程序只会在“聚合”系统中创建记录并分配新 ID。
  • 需要保留层次结构(例如“嘿其他 Rails 应用程序,我有流派,每种流派都有一位艺术家,每个艺术家都有一张专辑,每个专辑都有歌曲”等)

Mik*_*cic 3

您可以实施多种选项来使其发挥作用:

活跃资源

正如其他人回答的那样,您可以使用ActiveResource。阅读您的评论后,由于多重请求方面,这似乎是您想要避开的解决方案

接收控制器

您可以在第二个 Rails 应用程序中有一个控制器来接收数据并从中创建记录。

class RecordReceiver < ActiveRecord::Base
  def create
    params[:data][:posts].each do |p|
      Post.create(p)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以在“API”命名空间内命名该控制器,如果实施正确,这是一个相当干净的解决方案。

共享数据库

您可以在两个应用程序之间共享一个数据库。这意味着您不需要将数据从一个模型发送到另一个模型,它已经存在了。对于开发人员来说,这是最少的工作量,但根据您所拥有的系统架构,这可能是不可能的。

每个应用程序中有两个数据库

您可以在每个应用程序中实现多个数据库,如下所示:

#Add to database.yml
other_development:
  adapter: mysql
  database: otherdb_development
  username: root
  password:
  host: localhost

other_production:
  adapter: mysql
  database: otherdb_production
  username: root
  password:
  host: localhost
Run Code Online (Sandbox Code Playgroud)

然后,像这样定义你的模型:

class Post < ActiveRecord::Base

end

class PostClone < ActiveRecord::Base
  establish_connection "other_#{RAILS_ENV}"
end
Run Code Online (Sandbox Code Playgroud)

现在,您的Clone模型将指向当前数据库,并且该PostClone模型将指向另一个数据库。通过访问两者,您可以在需要时使用基本模型方法复制数据。

结论

由于您不想使用 ActiveResource,因此我建议您在应用程序之间共享数据库。如果这不可能,那么尝试使用两个模型,每个模型进入不同的数据库。最后,接收控制器是一个有效的选项,尽管速度较慢(因为它需要在数据库请求之上执行 HTTP 请求)