我有一个JRuby应用程序,我试图创建has_many through:
关系生活在两个完全不同的服务器上的数据库的has_many through:
关系。我知道连接不能在不同服务器上的表上工作。我想要的是模拟连接,以便使用模型的开发人员不必(知道)跨服务器连接。如何获得has_many通过:跨服务器工作
有在此设置一些额外的复杂性:
- 远程数据库是只读的
- 在远程数据库中的表名和主键不按轨道命名约定。 (远程数据库是Data Warehouse)
- 我希望能够使用该模型,就像其中有一个
has_and_belongs_to_many
。
我已经考虑写我自己的自定义association,但是这是一个有点复杂,我无法找到任何导游或任何真正的起点,其他则通过Rails代码读取。
有没有简单的方法来做到这一点,我失踪了?
建立一个自定义的ActiveRecord协会是最好的办法吗?如果是的话,我从哪里开始?
代码类似于我的设置:
config/database.yml
development:
adapter: postgresql
encoding: unicode
database: main
username: username
password: password
host: localhost
pool: 5
remote_development: # Read only
adapter: jdbcmssql
driver: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: 'jdbc:sqlserver://foo.com;databaseName=main'
username: username
password: password
app/models/account.rb
class Portfolio < ActiveRecord::Base
#has_and_belongs_to_many :dim_users, join_table: :accounts_dim_user
end
app/models/remote_model_base.rb
class RemoteModelBase
require "#{Rails.root}/lib/sqljdbc4.jar"
self.abstract_class = true
establish_connection "remote_#{Rails.env}".to_sym
after_initialize :readonly!
end
app/models/dim_user.rb
class DimUser < RemoteModelBase
self.table_name = 'DimUser'
self.primary_key = 'dwidDimUser'
#has_and_belongs_to_many :accounts, join_table: :accounts_dim_user
end
config/schema.rb
ActiveRecord::Schema.define(version: 20140925200106) do
create_table "accounts", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "accounts_dim_user", force: true, id: false do |t|
t.integer "dwidUser"
t.integer "account_id"
t.datetime "created_at"
t.datetime "updated_at"
end
# Defined in the remote database but it might look something like this
# create_table "DimUser" do |t|
# t.integer dwidUser
# # ...
# end
我发现宝石[ST别处(https://github.com/ briandoll/st-elsewhere),但我担心它已经5岁了。 – Nate 2014-09-26 22:03:28