Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sharing a class instance between two classes

Tags:

ruby

I have two different classes that both represent objects that need to be persisted to my database and now I want to share the database client object between the two classes. I want to avoid instantiating the client object more than once.

Currently I do this by using a global variable

$client = Mysql2::Client.new(:database => "myDb", :user => "user", :password => "password", :host => "localhost")

class Person
  def save
    $client.query("INSERT INTO persons")
  end
end

class Car
  def save
    $client.query("INSERT INTO cars")
  end
end

This works, but I am wondering if there are more correct ways to do this and why they are more correct?

like image 673
Simon Thordal Avatar asked Jan 29 '26 18:01

Simon Thordal


1 Answers

You can inherit from a parent class. This allows you to share common functionality across objects and follows DRY (do not repeat yourself) programming principles. It will also allow you to protect your DB connection with locks, resuces, queues, pools, and whatever else you may want to do without having to worry about it in your children classes

class Record
  @table_name = nil
  @@client = Mysql2::Client.new(:database => "myDb", :user => "user", :password => "password", :host => "localhost")

  def save
    @@client.query("INSERT INTO #{@table_name}") if @table_name
  end
end

class Person < Record
  @table_name = "persons"
end

class Car < Record
  @table_name = "cars"
end

While we are on the subject, you should look at using ActiveRecord for handling your database models and connections. It already does pretty much anything you'll need and will be more compatible with other gems already out there. It can be used without rails.

like image 178
lightswitch05 Avatar answered Jan 31 '26 16:01

lightswitch05



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!