【问题标题】:Rails: has_many association with a table in another database and without foreign keyRails:has_many与另一个数据库中的表关联并且没有外键
【发布时间】:2012-06-10 22:35:44
【问题描述】:

这是我的情况。我有一个名为 Account 的模型。一个账户可以有一个或多个合约。问题是我正在处理一个遗留应用程序,并且每个帐户的合同都存储在不同的数据库中。

例子:

账户 1 的合约在 account1_db.contracts 中。 账户 2 的合约在 account2_db.contracts 中。

数据库名称是存储在帐户表中的字段。

我怎样才能使 rails 关联与它一起工作?

这是一个遗留的 PHP 应用程序,我根本无法将其更改为将所有内容存储在一个表中。我需要让它以某种方式工作。

我试过了,但没用:

has_many :contracts, :conditions => [lambda{ Contract.set_table_name(self.database + '.contracts'); return '1' }]

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    为什么不能选择数据库迁移?

    您以错误的方式处理此问题。您希望集成中的两个系统松散耦合。通过尝试将两者关联起来,您正在创建一系列相互依赖关系,这些依赖关系稍后会反过来背叛您。您尝试的方法会产生紧密耦合并降低内聚力。


    但是,要直接回答您的问题,请参见下文。再一次,我不建议实施我在下面所说的,但从技术上讲它是一个解决方案。

    首先,rails 关联只能与外键一起使用。事实上,所有数据库关联都是这样工作的。没有外键就没有 ActiveRecord 关联方法,因为它违背了关联两个对象的含义。

    所以你不会通过 has_many 关联来完成它。相反,我只需在您的 Contract 模型上手动创建一个模拟 has_many 关联的函数。

    class Account
        memoize :contracts
    
        def contracts
         # Load from other database in here
        end
    
        def contracts=
        # Push to other database in here
        end
    end
    

    【讨论】:

    • 数据库迁移不是一种选择,因为其他系统使用它们并且它们都是蹩脚的 PHP 应用程序。正如您可能想象的那样,他们没有任何类型的测试,重写它们是不可能的。
    • 然后使用 API 接口/网络服务。当然,这远非理想,但它可以完成工作。
    • 另外,我考虑过做一个 API,但我真的很想利用 Rails 的强大功能和易用性来验证、构建嵌套表单等。编写 API 特别需要很长时间,因为所有验证都会必须用 PHP 编写。构建嵌套表单和插入/更新数据也不会那么容易。
    • 这可能会有所帮助:setfiremedia.com/blog/… 但是没有外键,你就完蛋了。
    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多