【问题标题】:Resue main application models and database with other rails application使用其他 Rails 应用程序恢复主要应用程序模型和数据库
【发布时间】:2019-04-07 09:19:35
【问题描述】:

我有一个 rails(3) 应用程序(Master),它具有架构、模型和数据库。此外,我还有另一个 rails(5) app(service) 没有任何模型,但我正在使用(主)应用程序数据库。

服务应用配置

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_cmets 加入,但一切都不起作用,这绝对不起作用,因为我们在服务应用程序中没有任何关联或任何模型。

基本上我的问题是

1) 我可以在服务应用中重复使用这个主数据库模型吗?

2) 如果我可以使用它,那么我可以将它与所有关联一起使用吗 例子: 服务应用程序中的 Blog.cmets .....

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

【问题讨论】:

  • 究竟是什么错误?
  • 我们无法使用关联,这是问题

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


【解决方案1】:

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

您在第 3 点放置的链接,他们刚刚创建了一个 rake 任务,将一些文件从一个应用程序复制到另一个应用程序,此复制模型是为了在那里建立关系并使其工作。它与上面的概念相同,但有一个 rake 任务来制作文件的副本。

【讨论】:

  • 感谢@xploshioOn,您提到了“您可以拥有相同的数据库,但需要有具有关系的模型才能使这项工作”。我有相同的数据库,我怎样才能让它工作?
【解决方案2】:

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

2) 是的,您需要添加模型以使关系存在,您不需要所有模型,但这可能会导致一些麻烦(例如在您需要评论模型的地方运行您在帖子模型中声明的范围)。

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

【讨论】:

    【解决方案3】:

    要回答您的问题,是的,正如 Remigio Arenas Muñoz de Cote 所回答的那样,您所问的所有问题都是可能的。

    但是,另一种(可以说更具语义化)方法是将您的共享模型变成一个 gem,您可以在任意多个项目之间共享它,同时保持一个代码库。

    这篇文章可能会比我在这里做的更深入:http://www.akitaonrails.com/2016/10/03/sharing-models-between-rails-apps-part-1

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      按照您链接的文章中的步骤进行操作。您的主模型需要镜像到您的服务对象中。由于您正在处理 Rails 5 vs 3(例如,最新的 5.2,假设 belongs_to 必须存在 [在验证中构建]),因此您会遇到一些问题。

      因此,如果可以的话,请将两个应用程序安装到同一版本上,这样更容易同步它们。否则,您将需要或多或少地手动维护它们之间的模型和测试。

      您还可以查看让旧应用设置 API 并与新应用进行对话。这样您就不需要所有模型,只需要服务所关注的相关项目。

      【讨论】:

        猜你喜欢
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        相关资源
        最近更新 更多