Ruby on rails Rails:与另一个数据库中的表有很多关联,并且没有外键
这是我的情况。我有一个叫Account的模型。一个帐户可以有一个或多个合同。问题是我处理的是一个遗留应用程序,每个帐户的合同都存储在不同的数据库中 例如: 账户1的合同在账户1\u db.contracts中。 账户2的合同在账户2\u db.contracts中 数据库名称是存储在accounts表中的字段 如何使rails关联与此一起工作 这是一个遗留的PHP应用程序,我无法将其更改为将所有内容存储在一个表中。我需要让它以某种方式运作 我试过这个,但没用:Ruby on rails Rails:与另一个数据库中的表有很多关联,并且没有外键,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,这是我的情况。我有一个叫Account的模型。一个帐户可以有一个或多个合同。问题是我处理的是一个遗留应用程序,每个帐户的合同都存储在不同的数据库中 例如: 账户1的合同在账户1\u db.contracts中。 账户2的合同在账户2\u db.contracts中 数据库名称是存储在accounts表中的字段 如何使rails关联与此一起工作 这是一个遗留的PHP应用程序,我无法将其更改为将所有内容存储在一个表中。我需要让它以某种方式运作 我试过这个,但没用: has_many :contrac
has_many :contracts, :conditions => [lambda{ Contract.set_table_name(self.database + '.contracts'); return '1' }]
有什么想法吗?为什么数据库迁移不是一种选择 你走错路了。您希望集成中的两个系统松散耦合。通过尝试将两者关联起来,您正在创建一系列相互依赖关系,这些相互依赖关系将在稍后出现,从而为您提供支持。您尝试的方法会创建紧密耦合并降低内聚性
但是,要直接回答您的问题,请参见下文。再一次,我不建议实现我下面所说的,但从技术上讲,这将是一个解决方案 第一件事是rails关联只对外键起作用。事实上,所有数据库关联都是这样工作的。没有没有外键的ActiveRecord关联方法,因为它无法关联两个对象 所以你不会和一个有很多联系的人一起完成这件事。相反,我只需要在您的合同模型上手动创建一个函数,该函数模拟多个关联
class Account
memoize :contracts
def contracts
# Load from other database in here
end
def contracts=
# Push to other database in here
end
end
为什么数据库迁移不是一种选择 你走错路了。您希望集成中的两个系统松散耦合。通过尝试将两者关联起来,您正在创建一系列相互依赖关系,这些相互依赖关系将在稍后出现,从而为您提供支持。您尝试的方法会创建紧密耦合并降低内聚性
但是,要直接回答您的问题,请参见下文。再一次,我不建议实现我下面所说的,但从技术上讲,这将是一个解决方案 第一件事是rails关联只对外键起作用。事实上,所有数据库关联都是这样工作的。没有没有外键的ActiveRecord关联方法,因为它无法关联两个对象 所以你不会和一个有很多联系的人一起完成这件事。相反,我只需要在您的合同模型上手动创建一个函数,该函数模拟多个关联
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,但我真的很想利用Rails的强大功能和易用性来验证、构建nester表单等。编写API需要很长时间,因为所有的验证都必须用PHP编写。此外,构建嵌套表单和插入/更新数据也不会那么容易。这可能会有所帮助:但如果没有外键,你就完蛋了。数据库迁移不是一个选项,因为其他系统使用它们,它们都是蹩脚的PHP应用程序。正如您可能想象的那样,它们没有任何类型的测试,重写它们是不可能的。当然,这远非理想,但它会完成工作。此外,我曾想过做一个API,但我真的很想利用Rails的强大功能和易用性来验证、构建nester表单等。编写API需要很长时间,因为所有的验证都必须用PHP编写。此外,构建嵌套表单和插入/更新数据也不会那么容易。这可能会有所帮助:但如果没有外键,你就完蛋了。