4

「汎用モデル」を作成して、任意のデータベースの任意のテーブルに接続できるようにしようとしています。まず、指定された別のデータベースに接続するこのクラスを作成しました(スキーマを使用しません)

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を継承してテーブル名を指定するこのクラスを作りました

Gモデル

class Gmodel < Db

    def initialize(new_table_name)
        ActiveRecord::Base.set_table_name(new_table_name)
        super
    end

end

最後にコントローラーで

メインコントローラー

class MainController < ApplicationController

  def index
    @users = Gmodel.new("users")
  end

end

しかし、それは私にこのエラーを与えました:

undefined method `stringify_keys' for "users":String

何が間違っている可能性がありますか?これを行うためのより良い方法はありますか?前もって感謝します!

4

1 に答える 1

12

実行時に単純にサブクラスを作成して、ActiveRecord::Baseすべての面倒を避けてみませんか?

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

次にcARクラスを参照し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
于 2012-05-23T16:38:21.740 に答える