Just ran a quick script for you, here's the repo: https://github.com/beneggett/many_db_example
In the repo, I just made 2 different db on my local one, but that doesn't matter, the principle is the same:
It seemed to me that this worked well:
account_dim_users, has_many through/habtm.
class Account < ActiveRecord::Base
has_many :account_dim_users
def dim_users
account_dim_users.map {|account_dim_user| DimUser.find_by(dwidUser: account_dim_user.dwidUser) }
end
end
, , , ; .
AccountDimUser ( )
class AccountDimUser < ActiveRecord::Base
has_many :accounts
has_many :dim_users, primary_key: :dwidUser, foreign_key: :dwidUser
end
account_dim_users
class DimUser < ActiveRecord::Base
establish_connection "other_db".to_sym
after_initialize :readonly!
self.table_name = 'DimUser'
self.primary_key = 'dwidUser'
def account_dim_users
AccountDimUser.where(dwidUser: self.dwidUser)
end
def accounts
account_dim_users.map {|account_dim_user| Account.find(account_dim_user.account_id) }
end
end
- Ruby :
a = Account.first
Account Load (0.6ms) SELECT "accounts".* FROM "accounts" ORDER BY "accounts"."id" ASC LIMIT 1
=>
:id => 1,
:name => "New account",
:created_at => Mon, 29 Sep 2014 15:07:07 UTC +00:00,
:updated_at => Mon, 29 Sep 2014 15:07:07 UTC +00:00
}
-
a.account_dim_users
=> #<ActiveRecord::Associations::CollectionProxy [#<AccountDimUser id: 1, dwidUser: 1, account_id: 1, created_at: "2014-09-29 15:08:47", updated_at: "2014-09-29 15:08:47">, #<AccountDimUser id: 3, dwidUser: 5, account_id: 1, created_at: "2014-09-29 15:24:17", updated_at: "2014-09-29 15:25:06">]>
-
a.dim_users
AccountDimUser Load (0.3ms) SELECT "account_dim_users".* FROM "account_dim_users" WHERE "account_dim_users"."account_id" = $1 [["account_id", 1]]
DimUser Load (0.9ms) SELECT "DimUser".* FROM "DimUser" WHERE "DimUser"."dwidUser" = 1 LIMIT 1
DimUser Load (0.3ms) SELECT "DimUser".* FROM "DimUser" WHERE "DimUser"."dwidUser" = 5 LIMIT 1
=> [
[0]
:id => 1,
:dwidUser => 1,
:created_at => Mon, 29 Sep 2014 15:06:44 UTC +00:00,
:updated_at => Mon, 29 Sep 2014 15:06:44 UTC +00:00
},
[1]
:id => 5,
:dwidUser => 5,
:created_at => Mon, 29 Sep 2014 15:23:01 UTC +00:00,
:updated_at => Mon, 29 Sep 2014 15:23:01 UTC +00:00
}
]
-
d = DimUser.first
DimUser Load (0.5ms) SELECT "DimUser".* FROM "DimUser" ORDER BY "DimUser"."dwidUser" ASC LIMIT 1
=>
:id => 1,
:dwidUser => 1,
:created_at => Mon, 29 Sep 2014 15:06:44 UTC +00:00,
:updated_at => Mon, 29 Sep 2014 15:06:44 UTC +00:00
}
-
d.account_dim_users
AccountDimUser Load (0.5ms) SELECT "account_dim_users".* FROM "account_dim_users" WHERE "account_dim_users"."dwidUser" = 1
=>
-
d.accounts
AccountDimUser Load (0.5ms) SELECT "account_dim_users".* FROM "account_dim_users" WHERE "account_dim_users"."dwidUser" = 1
Account Load (0.4ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 LIMIT 1 [["id", 1]]
=> [
[0]
:id => 1,
:name => "New account",
:created_at => Mon, 29 Sep 2014 15:07:07 UTC +00:00,
:updated_at => Mon, 29 Sep 2014 15:07:07 UTC +00:00
}
]
, , , .
, :
def find_dim_user
DimUser.find_by(dwidUser: self.dwidUser)
end
, , ruby .
, !
: , , :
class Account < ActiveRecord::Base
has_many :account_dim_users
def dim_users
dim_user_ids = account_dim_users.map {|account_dim_user| account_dim_user.dwidUser }
DimUser.where(dwidUser: dim_user_ids)
end
end