这是我的情况。我有一个名为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' }]
有什么想法吗?
答案 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