通过 has_many 进行多个数据库连接
如何通过使用多个数据库连接来创建 has_many ?
我有一个名为“master”的数据库,其中保存位置信息。这是从单独的应用程序更新的。用户可以访问许多位置,但所有其他模型都位于另一个名为“budget”的数据库中。以下是模型的设置方式。
# place.rb
class Place < ActiveRecord::Base
belongs_to :user
belongs_to :location
end
# user.rb
class User < ActiveRecord::Base
has_many :locations, :through => :places
has_many :places
end
# location.rb
class Location < ActiveRecord::Base
establish_connection "master"
has_many :places
has_many :users, :through => :places
end
当我通过 irb 运行命令时,我得到以下信息
> Location.first.places.create(:user_id => 1)
> #<Place id: 1, user_id: 1, location_id: 1, created_at: "2011-11-28 20:58:43", updated_at: "2011-11-28 20:58:43">
> Location.first.places
> [#<Place id: 1, user_id: 1, location_id: 1, created_at: "2011-11-28 20:58:43", updated_at: "2011-11-28 20:58:43">]
> Location.first.users
> [#<User id: 1, username: "toby", role: "guest", created_at: "2011-11-28 17:45:40", updated_at: "2011-11-28 17:45:40">
> User.first.locations
> Mysql2::Error: Table 'master.places' doesn't exist: SELECT `locations`.* FROM `locations` INNER JOIN `places` ON `locations`.`id` = `places`.`location_id` WHERE `places`.`user_id` = 1 ActiveRecord::StatementInvalid: Mysql2::Error: Table 'master.places' doesn't exist: SELECT `locations`.* FROM `locations` INNER JOIN `places` ON `locations`.`id` = `places`.`location_id` WHERE `places`.`user_id` = 1
我尝试将当前的 Rails env 添加到 Place 来尝试覆盖 place 的默认数据库,如下所示: # 地点.rb 班级地点< ActiveRecord::基础 建立_连接Rails.env 属于:用户 属于:位置 这
#database.yml
master:
adapter: mysql2
encoding: utf8
reconnect: false
database: master
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
development:
adapter: mysql2
encoding: utf8
reconnect: false
database: budget_development
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
没有帮助。有什么想法吗?
How can I make a has_many through work with multiple database connections?
I have a database named "master" that holds the location information. That is updated from a separate application. Users can have access to many locations, but all the other models are located in another database named "budget". Here are how the models are setup.
# place.rb
class Place < ActiveRecord::Base
belongs_to :user
belongs_to :location
end
# user.rb
class User < ActiveRecord::Base
has_many :locations, :through => :places
has_many :places
end
# location.rb
class Location < ActiveRecord::Base
establish_connection "master"
has_many :places
has_many :users, :through => :places
end
When I run commands through irb, I get the following
> Location.first.places.create(:user_id => 1)
> #<Place id: 1, user_id: 1, location_id: 1, created_at: "2011-11-28 20:58:43", updated_at: "2011-11-28 20:58:43">
> Location.first.places
> [#<Place id: 1, user_id: 1, location_id: 1, created_at: "2011-11-28 20:58:43", updated_at: "2011-11-28 20:58:43">]
> Location.first.users
> [#<User id: 1, username: "toby", role: "guest", created_at: "2011-11-28 17:45:40", updated_at: "2011-11-28 17:45:40">
> User.first.locations
> Mysql2::Error: Table 'master.places' doesn't exist: SELECT `locations`.* FROM `locations` INNER JOIN `places` ON `locations`.`id` = `places`.`location_id` WHERE `places`.`user_id` = 1 ActiveRecord::StatementInvalid: Mysql2::Error: Table 'master.places' doesn't exist: SELECT `locations`.* FROM `locations` INNER JOIN `places` ON `locations`.`id` = `places`.`location_id` WHERE `places`.`user_id` = 1
I tried adding the current rails env to Place to try and override the default database for place, like this:
# place.rb
class Place < ActiveRecord::Base
establish_connection Rails.env
belongs_to :user
belongs_to :location
end
#database.yml
master:
adapter: mysql2
encoding: utf8
reconnect: false
database: master
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
development:
adapter: mysql2
encoding: utf8
reconnect: false
database: budget_development
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
That didn't help. Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
一位朋友帮我回答了这个问题,我想这可能对其他人有用。
A friend answered this for me, and I figured it might be of some use to others.
答案对我有用,但我在关系表中使用这个版本:
The answer works for me, but I use this version in my relation table:
几年后阅读本文的任何人都请注意,Rails 7 已为
has_one
和has_many
引入了显式disable_joins: true
选项。参考: https://edgeguides.rubyonrails.org/ active_record_multiple_databases.html#handling-associations-with-joins-across-databases
Anyone reading this a few years later, please be advised Rails 7 has introduced an explicit
disable_joins: true
option tohas_one
andhas_many
.ref: https://edgeguides.rubyonrails.org/active_record_multiple_databases.html#handling-associations-with-joins-across-databases