database.yml
看起来像
development:
adapter: mysql2
host: localhost
database: database1
username: root
password:
external:
adapter: mysql2
host: localhost
database: database2
username: root
password:
我有一个班级ExternalDatabaseConnection
class ExternalDatabaseConnection < ActiveRecord::Base
self.abstract_class = true
establish_connection(:external) #connect to external DB specified in database.yml
attr_protected
end
我使用AR
在我的外部数据库上查询。
database2(外部数据库)是从用户端动态设置的,我没有关于表和属性的任何信息。
database1(内部数据库),包含有关表和某些属性的信息。
所以基本上我必须动态处理事情。
工作正常。
ExternalDatabaseConnection.table_name = "set_table1" #dynamic
ExternalDatabaseConnection.create(...) #creates a record.
这不是。
ExternalDatabaseConnection.table_name = "set_different_table" #dynamic
ExternalDatabaseConnection.create(...)
引发
unknown attribute: attribute_name
这两件事都是在循环中发生的,因此每次它对初始表集合都有效,对于第二个表,它会抛出错误。
调试:
注意:
ExternalDatabaseConnection.table_name = "payments"
ExternalDatabaseConnection.column_names
=> ["id", "customer_id", "patent_id", "amount", "currency", "date"]
ExternalDatabaseConnection.table_name = "patents"
=> "patents"
2.0.0-p451 :006 > ExternalDatabaseConnection.column_names
=> ["id", "customer_id", "patent_id", "amount", "currency", "date"]
ExternalDatabaseConnection.all
ExternalDatabaseConnection Load (0.4ms) SELECT `patents`.* FROM `patents`
=> [#<ExternalDatabaseConnection id: 1, number: "1111", description: "https://www.google.co.in", registry_date: "2014-08-20", documnetdir: nil, currency: #<BigDecimal:a8f2adc,'0.1212E2',18(27)>>, #<ExternalDatabaseConnection id: 4, number: "1", description: "jhufgtrdfyuh", registry_date: nil, documnetdir: "", currency: #<BigDecimal:a8f2258,'0.0',9(18)>>, ....]
属性没有变化,可能会导致问题。
如果缺少任何信息,请注释。
ruby 2.0.0p451
Rails 3.2.17
EDIT1:
尝试:
在设置表名之前
1)ExternalDatabaseConnection.table_name = nil
。
2)ExternalDatabaseConnection.clear_active_connections!
和clear_all_connections!
3)尝试使用set_table_name :table1
EDIT2:
即使为ClassName.column_names
设置了不同的table_name
, Class
也没有改变
答案 0 :(得分:4)
我试过以下方式。这可能会有所帮助
:set_table_name方法用于动态更改表名。您可以设置表名并获取属性名称而不是列名称。
付款表
ExternalDatabaseConnection.set_table_name:付款
ExternalDatabaseConnection.first.attribute_names
然后你必须重置列信息
ExternalDatabaseConnection.reset_column_information
专利:
ExternalDatabaseConnection.set_table_name:专利
ExternalDatabaseConnection.first.attribute_names