Ruby - projekt obsługi bazy danych

EDIT: Temat nieaktualny.

Nie jestem pewien, czy dobrze zatytułowałem temat :smile:

Ale do rzeczy. Zamierzam napisać klasę bazodanową (opartą wyłącznie na zapisanym formacie JSON tablicy wielorymiarowej). Wykonywanie zapytań, sortowanie wyników itd. widzę nie poprzez pisanie poleceń SQL, tylko chainowanie metod. Na przykład:

db.table('users').select('name', 'email').where('name != frank', 'name != rob').sort_by('name')

Coś w tym stylu. I na razie to widzę tak:
db - obiekt klasy Database, nawiązujący połączenie z wybraną bazą (/plikiem)
table - metoda klasy Database wybierająca tabelę i zwracająca obiekt klasy Table
select - metoda klasy table, zwracająca obiekt klasy Result
where, sort_by - metody klasy Result do operacji na wynikach

I zastanawiam się, jak to wszystko połączyć - czy powinno to wyglądać tak, że Table i Result dziedziczą po Database? Czy może powinny to być niezależne klasy (chociaż Table powinno być zależne od Database, żeby miało dostęp do bazy danych/pliku, natomiast Result może już funkcjonować samodzielnie)? To pytanie pierwsze.
I jak zrobić, aby można było (w pewnej ograniczonej mierze) chainować metody? Muszę np. przy Database.table() zrobić

return Table.new(nazwa tabeli)

A następnie przy Table.select()

return Result.new(wynik select)

A przy Result.where mam na koniec zwrócić “self”, aby móc w razie czego operować na wynikach dalej?
? W taki sposób należy zrobić to chainowanie?

Coś jak https://github.com/jeremyevans/sequel ?

Sequel to nakładka z tego co widzę, a ja chcę zrobić coś całkowicie od zera - cały system bazodanowy.

Teraz sobie testuję i zaproponowane przeze mnie założenie dziedziczenie nie jest do końca poprawne. Ponieważ jeśli połączenie z bazą = instancja klasy Database, to gdy Table dziedziczy po Database to i tak nie ma dostępu do tej instancji, więc de facto nic nie wie o bazie. Jak to rozwiązać? Na razie mi wychodzi na to, że najlepiej by działało, gdybym stworzył 3 klasy nie dziedziczące nic od siebie (Database, Table, Result) i po prostu wywołania w nich wraz z przekazywaniem odpowiednich danych (przekazywanie połączenia z bazą i rezulatatów).

Na razie wpadłem na taki pomysł:

module DatabaseTable
  class Table
    def initialize
      puts "Class is working!"
    end

    def some_method
      puts "Some method is working too!"
    end
  end
end

class Database
  include DatabaseTable
  attr_reader :table
  def initialize
    @table = Table.new
  end
end

a = Database.new # Class is working!
a.table.some_method # Some method is working too!"

I wydaje mi się najlepszy. Co sądzicie? W ten sposób klasy Table i potem Result będą same w sobie niefunkcjonalne, natomiast wewnątrz klasy Database (po include) wszystko działa.