动态设置表名,这个bug?

时间:2014-08-26 08:06:13

标签: ruby-on-rails ruby

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

这两件事都是在循环中发生的,因此每次它对初始表集合都有效,对于第二个表,它会抛出错误。

调试:

enter image description here

注意:

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也没有改变

1 个答案:

答案 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

相关问题