与其他Rails应用程序一起恢复主要应用程序模型和数据库

时间:2018-11-03 10:05:31

标签: ruby-on-rails postgresql heroku multi-tenant

我有一个rails(3)应用程序(Master),其中包含架构,模型和数据库。另外,我还有另外一个rails(5)应用程序(服务),它没有任何模型,但是我正在使用(主)应用程序数据库。

服务应用程序配置

common_db:
  adapter: postgresql
  database: 'blog'
  username: 'username'
  password: 'password'
  host: 'localhost'
  pool: '10'

application_record.rb

 class ApplicationRecord < ActiveRecord::Base
   self.abstract_class = true
   establish_connection     
   Rails.configuration.database_configuration["common_db"]
 end

然后我在服务应用程序中添加了一个相同的模型,然后尝试从主应用程序中获取一些值

class post < ApplicationRecord
    has_many :comments
    scope :article_comments, lambda { |a| select("created_at").joins('INNER JOIN comments on post.id = comments.post_id').where('article_id = ?', 
    a) }
end

,如果我在这里致电 Post.article_comments ,但所有操作均无效,则绝对不能使用,因为我们在服务应用中没有任何关联或任何模型。

基本上我的问题是

1)我可以在服务应用程序中重用此主数据库模型吗?

2)如果我可以使用它,那么我可以在所有关联中使用它吗?     例:        服务应用中的Blog.comments        .....

3)还有其他好的方法可以重用此方法,我也看到了一些文章     https://hiltmon.com/blog/2013/10/14/rails-tricks-sharing-the-model/,这是一件好事吗?

4 个答案:

答案 0 :(得分:0)

请记住,关系是在模型中设置的,您可以具有相同的数据库,但是需要在其中具有关系的模型才能进行此工作。

您放置在第3点的链接上,他们只是创建了一个rake任务,用于将一些文件从一个应用程序复制到另一个应用程序,此复制模型的目的是在其中建立关系并使之正常工作。与上面的概念相同,但是有一个rake任务可以复制文件。

答案 1 :(得分:0)

1)是的,您可以通过服务应用程序重用主数据库模型(在Heroku上确实很容易做到)。

2)是的,您需要添加模型以使关系存在,不需要所有的模型,但是这可能会引起一些麻烦(例如,运行在post的模型中声明的范围并在其中需要注释的模型)。 / p>

3)The link you provide是确保您的模型最新的好方法。您也可以在主应用程序中编写一个rake任务,以更新模型并在每次提交时触发它。

答案 2 :(得分:0)

要回答您的问题,是的,正如Remigio ArenasMuñozde Cote回答的那样,您所要提出的一切都是可能的。

但是,另一种方法(可能还有更多语义)是将共享模型变成一个gem,您可以在想要的多个项目之间共享它们,并保持一个代码库。

本文可能比我在这里更深入地解释:http://www.akitaonrails.com/2016/10/03/sharing-models-between-rails-apps-part-1

希望有帮助。

答案 3 :(得分:0)

从字面上看,请遵循您链接的文章中的步骤。您的主模型需要镜像到您的服务对象中。因为要处理Rails 5 vs 3(例如,最新的5.2,假定必须存在belongs_to [在验证中构建]),所以您会遇到一些麻烦。

因此,如果可以的话,请将两个应用程序都安装在相同的版本上,以便更轻松地同步它们。否则,您将需要手工或多或少地维护模型和模型之间的测试。

您还可以考虑让旧应用设置API,然后与新API进行交流。这样,您将不需要所有模型,仅需要服务所涉及的相关项目。