Problems creating a universal model in Ruby on Rails 3

I am trying to create a “generic model” so that it can connect to any table in any database. First, I created this class that connects to another given database (without using a schema)

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 

Then I made this class that inherits from Db and indicates the name of the table

Gmodel

 class Gmodel < Db def initialize(new_table_name) ActiveRecord::Base.set_table_name(new_table_name) super end end 

Finally, in the controller

Maincontroller

 class MainController < ApplicationController def index @users = Gmodel.new("users") end end 

But this gives me this error:

 undefined method `stringify_keys' for "users":String 

What could be wrong? Is there a better way to do this? Thanks in advance!

+4
source share
1 answer

Why just subclass ActiveRecord::Base at run time and avoid all the problems?

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

then c refers to the AR class for some_table , and you can do the usual things:

 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 column names 

This is Ruby, where classes are objects too.

If you need to connect to another database, you can put the establish_connection call into a block along with 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 
+12
source

Source: https://habr.com/ru/post/1413982/


All Articles