Rails:has_many与另一个数据库中的表关联,没有外键

时间:2012-06-10 22:35:45

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

这是我的情况。我有一个名为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' }]

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

为什么数据库迁移不是一个选项?

你接近这个错误的方式。您希望集成中的两个系统松散地耦合。通过尝试将两者相关联,您将创建一系列相互依赖关系,以后会出现在您的背后。您正在尝试的方法会产生紧密耦合并降低内聚力。


但是,直接回答您的问题,请参阅下文。再一次,我不推荐实现我在下面所说的内容,但从技术上讲,这将是一个解决方案。

首先,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