主要思想是我有几个 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
我正在回避 Active Resource,因为我有数千条记录要创建,这意味着每条记录都有数千个请求。除非有一种方法可以通过简单的 Active Resource 在一个请求中完成所有操作,否则我想避免使用它。
- 格式无关紧要。一切方便。
- 不需要发送 ID,因为其他应用只会在“聚合”系统中创建记录并分配新 ID。
- 需要保留层次结构(例如,“嘿,其他 Rails 应用程序,我有流派,每个流派都有一个艺术家,每个艺术家都有一张专辑,每张专辑都有歌曲”等)
最佳答案
您可以实现多个选项来使其正常工作:
事件资源
正如其他人回答的那样,您可以使用 ActiveResource .阅读您的评论后,由于多请求方面,这似乎是您想要避开的解决方案
接收 Controller
您可以在第二个 Rails 应用程序中有一个 Controller 来接收数据并从中创建记录。
class RecordReceiver < ActiveRecord::Base
def create
params[:data][:posts].each do |p|
Post.create(p)
end
end
end
您可以在“API”命名空间内命名此 Controller ,如果实现得当,这是一个相当干净的解决方案。
共享数据库
您可以在两个应用程序之间共享一个数据库。这意味着您不需要将数据从一个模型发送到另一个模型,它已经存在了。作为开发人员,这对您来说是最少的工作量,但可能无法实现,具体取决于您拥有的系统架构。
每个应用程序中的两个数据库
您可以在每个应用程序中实现多个数据库,如下所示:
#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
然后,像这样定义你的模型:
class Post < ActiveRecord::Base
end
class PostClone < ActiveRecord::Base
establish_connection "other_#{RAILS_ENV}"
end
现在,您的Clone
模型将指向当前数据库,而PostClone
模型将指向另一个数据库。通过访问这两者,您可以在需要时使用基本模型方法复制数据。
结论
既然您不想使用 ActiveResource,我建议您只在应用程序之间共享数据库。如果这不可能,则尝试使用两个模型,每个模型都转到不同的数据库。最后,接收 Controller 是一个有效的选项,尽管速度较慢(因为它需要在数据库请求之上执行 HTTP 请求)
关于ruby-on-rails - 如何在相同的 Rails 应用程序之间序列化和通信 ActiveRecord 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303163/