来自多个数据库的rails5habtm在mysql命令中工作,但在Rails中出错

来自多个数据库的rails5habtm在mysql命令中工作,但在Rails中出错,mysql,ruby-on-rails,Mysql,Ruby On Rails,我正在构建一个rails 5应用程序,它连接到两个不同的数据库(dbA和dbB)。我的数据库位于同一数据库主机上 我想列个愿望清单。使用相同的数据库时非常容易,但我遇到了一个“有趣的”错误 这就是数据库的外观: 模型如下: user.rb class User < ApplicationRecord has_one :wishlist, dependent: :destroy end class Wishlist < ApplicationRecord belongs_t

我正在构建一个rails 5应用程序,它连接到两个不同的数据库(dbA和dbB)。我的数据库位于同一数据库主机上

我想列个愿望清单。使用相同的数据库时非常容易,但我遇到了一个“有趣的”错误

这就是数据库的外观:

模型如下:

user.rb

class User < ApplicationRecord
  has_one :wishlist, dependent: :destroy
end
class Wishlist < ApplicationRecord
  belongs_to :user
  # has_and_belongs_to_many :wines
  # The above did not work
  # so I had to revert to has_many through
  has_many :wines_wishlists
  has_many :wines, through: :wines_wishlists
end
class WinesWishlist < ApplicationRecord
  belongs_to :wine
  belongs_to :wishlist

  def self.table_name_prefix
    "dbA_#{Rails.env}."
  end
  # I added the above to prevent ActiveRecord from
  # looking for the table in the wrong database
end
它在我正在开发的本地机器上工作。它在我的暂存服务器上不工作!当我在rails控制台中尝试时,我得到以下结果:

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'dbA_staging.wines_wishlists' doesn't exist: SELECT  `dbB_staging`.`wines`.* FROM `dbB_staging`.`wines` INNER JOIN `dbA_staging`.`wines_wishlists` ON `dbB_staging`.`wines`.`id` = `dbA_staging`.`wines_wishlists`.`wine_id` WHERE `dbA_staging`.`wines_wishlists`.`wishlist_id` = 1
这是预期的SQL

user.wishlist.wines.to_sql
=> "SELECT  `dbB_staging`.`wines`.* FROM `dbB_staging`.`wines` INNER JOIN `dbA_staging`.`wines_wishlists` ON `dbB_staging`.`wines`.`id` = `dbA_staging`.`wines_wishlists`.`wine_id` WHERE `dbA_staging`.`wines_wishlists`.`wishlist_id` = 1"
更好的是,当我在我的登台机器上尝试在
railsdb
中使用相同的SQL时,它就可以工作了!!尽管SQL是正确的,但它在rails中不起作用,但它在mysql命令行中起作用

我的代码是基于和生成的,但我似乎不知道如何解决这个问题

我正在使用(与开发和阶段相同):

  • 轨道5.1.1
  • ruby 2.4.0p0
  • mysql 5.6.34(暂存)
  • mysql 5.7.17(开发)

任何帮助都将不胜感激

看看你链接到的文章,它似乎使用了一个gem,即


此外,正如本文所述,您不能跨数据库连接进行
JOIN
查询。gem使用了一些效率较低的查询来避免这种情况,我没有查看这些查询的详细信息。

谢谢您的回复。我认为这篇文章说,对于同一主机上的两个数据库,没有必要使用gem,正如我在问题中所说的,gem可以用于开发,但出于某种原因,它不能用于登台。那么这就意味着您的开发环境和登台环境之间存在一些不匹配。您确定环境之间的所有数据库和表都相同吗?相同。正如我所说,在暂存服务器上,它可以在mysql命令行中工作,但不能在rails中工作,尽管输出了相同的SQL。如果您确定完全相同的SQL输出在db cli中工作,但在通过
ActiveRecord
调用时不工作,我就不知所措了。那么我们两个:)!谢谢你的帮助!
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'dbA_staging.wines_wishlists' doesn't exist: SELECT  `dbB_staging`.`wines`.* FROM `dbB_staging`.`wines` INNER JOIN `dbA_staging`.`wines_wishlists` ON `dbB_staging`.`wines`.`id` = `dbA_staging`.`wines_wishlists`.`wine_id` WHERE `dbA_staging`.`wines_wishlists`.`wishlist_id` = 1
user.wishlist.wines.to_sql
=> "SELECT  `dbB_staging`.`wines`.* FROM `dbB_staging`.`wines` INNER JOIN `dbA_staging`.`wines_wishlists` ON `dbB_staging`.`wines`.`id` = `dbA_staging`.`wines_wishlists`.`wine_id` WHERE `dbA_staging`.`wines_wishlists`.`wishlist_id` = 1"
has_many_elsewhere :wines, :through => :wines_wishlist