2012-05-23 84 views
4

我试图制作一个“通用模型”,以便它可以连接到任何数据库的任何表。首先,我做了这个类,它会连接到指定(不使用模式),另一个数据库在Ruby on Rails 3中制作通用模型时遇到的问题

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 

于是,我做了这个类从数据库继承并指定表名

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 

但是,它gaves我这个错误:

undefined method `stringify_keys' for "users":String 

出了什么问题?有没有更好的方法来做到这一点?提前致谢!

+0

什么是抽象类DB的目的是什么? – sailor

+0

你曾经是一名Java开发人员吗? –

回答

12

为什么不简单create an ActiveRecord::Base subclass在运行时避免所有的麻烦?

t = 'some_table' 
c = Class.new(ActiveRecord::Base) { self.table_name = t } 

然后c指AR类some_table,你可以做平常的事情:

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 
+0

非常感谢,真棒! – pablomarti

+0

这看起来非常像我可以用来解决[这个问题](http://stackoverflow.com/questions/10729289/tableless-model-with-activerecord-associations-in-rails-3-2) - 会大大感谢你能否看看并给我一些建议? –

+1

Rails 4不支持匿名ActiveRecord类:https://github.com/rails/rails/issues/8934 –