我正在尝试制作一个“通用模型”,以便它可以连接到任何数据库的任何表。首先,我创建了这个连接到另一个指定数据库(不使用模式)的类
Db的
class Db < ActiveRecord::Base
self.abstract_class = true
attr_accessor :error
def initialize(item = nil)
@error = ""
connect
super
end
def connect
could_connect = true
@error = ""
begin
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:username => "root",
:password => "",
:database => "another_database",
:port => 3306,
:encoding => "utf8"
)
rescue ActiveRecord::ConnectionNotEstablished
@error = "Could not connect to database. The connection was not established"
could_connect = false
rescue Mysql2::Error
@error = "Could not connect to database using MySQL2"
could_connect = false
rescue => e
@error = "Could not connect to database. #{e.message}."
could_connect = false
end
return could_connect
end
end
然后,我创建了这个继承自Db的类并指定了表名
Gmodel
class Gmodel < Db
def initialize(new_table_name)
ActiveRecord::Base.set_table_name(new_table_name)
super
end
end
最后,在控制器中
MainController
class MainController < ApplicationController
def index
@users = Gmodel.new("users")
end
end
但是,它给了我这个错误:
undefined method `stringify_keys' for "users":String
可能有什么不对?有没有更好的方法来做到这一点?提前谢谢!
答案 0 :(得分:12)
为什么不在运行时简单create an ActiveRecord::Base
subclass并避免所有麻烦?
t = 'some_table'
c = Class.new(ActiveRecord::Base) { self.table_name = t }
然后c
引用some_table
的AR类,你可以做通常的事情:
o = c.find(1)
# 'o' is now a wrapper for the row of some_table where 'id = 1'
cols = c.columns.map(&:name)
# 'cols' is now an array of some_table's column names
这是Ruby,其中类也是对象。
如果您需要连接到另一个数据库,那么您可以将establish_connection
调用与self.table_name
一起放在块中:
t = 'some_table'
d = 'some_other_database'
c = Class.new(ActiveRecord::Base) do
establish_connection(:adapter => 'mysql2', :database => d, ...)
self.table_name = t
end