Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:与另一个数据库中的表有很多关联,并且没有外键_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails Rails:与另一个数据库中的表有很多关联,并且没有外键

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

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

例如:

账户1的合同在账户1\u db.contracts中。 账户2的合同在账户2\u db.contracts中

数据库名称是存储在accounts表中的字段

如何使rails关联与此一起工作

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

我试过这个,但没用:

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编写。此外,构建嵌套表单和插入/更新数据也不会那么容易。这可能会有所帮助:但如果没有外键,你就完蛋了。