I am trying to teach myself about repository pattern in ruby. Could you please review my code.
adapter.rb
module Adapter
class Main
def prebuild(obj)
self.set_table_name = obj.table_name.to_s
variables = obj.instance_variables
@values = []
@keys = []
variables.reject! { |c| c.to_s == '@table_name' }.map do |key, value|
@keys.push(key.to_s.gsub('@', ''))
@values.push(obj.send(@keys.last))
end
end
def get_table_name
@table_name
end
def get_keys
@keys
end
def get_values
@values.map { |value| "'#{value}'" }
end
def set_table_name=(table_name)
@table_name = table_name
end
end
class Sqlite < Main
require 'sqlite3'
def initialize
@db = SQLite3::Database.new 'file.db'
end
def persist(obj)
prebuild(obj)
sql_string = "INSERT INTO #{get_table_name} (#{get_keys.join(', ')}) VALUES (#{get_values.join(', ')})"
@db.execute sql_string
obj.id = @db.execute "SELECT last_insert_rowid()"
obj
end
def retrieve(entity, id)
self.set_table_name = entity.table_name
rows = @db.execute "SELECT * FROM #{get_table_name} WHERE id=#{id}"
fields = get_fields
new_entity = entity.new
for i in (0..fields.size-1)
new_entity.send("#{fields[i]}=", rows[0][i])
end
new_entity
end
def get_fields
rows = @db.execute "PRAGMA TABLE_INFO (#{get_table_name});"
rows.map { |name| name[1] }
end
def delete(obj)
prebuild(obj)
@db.execute "DELETE FROM #{get_table_name} WHERE id=#{obj.id}"
end
end
end
entity.rb
module Entity
class Member
attr_reader :table_name
attr_accessor :username
attr_accessor :email
attr_accessor :password
class << self
def table_name
@table_name ||= 'members'
end
end
def table_name
@table_name ||= 'members'
end
def id=(new_id)
@id = new_id
end
def id
@id
end
def username=(new_username)
@username = new_username
end
def username
@username
end
def email=(new_mail)
@email = new_mail
end
def email
@email
end
def password=(new_password)
@password = new_password
end
def password
@password
end
end
end
repository.rb
module Repository
class Member
def initialize(adapter)
@adapter = adapter.new
end
def save(member)
@adapter.persist(member)
end
def get(id)
@adapter.retrieve(Entity::Member, id)
end
def delete(member)
@adapter.delete(member)
end
end
end
test.rb
require './lib/entity'
require './lib/adapter'
require './lib/repository'
member = Entity::Member.new
member.username = 'ahmet'
member.email = '[email protected]'
member.password = '12345'
repository = Repository::Member.new(Adapter::Sqlite)
repository.save(member)
member = repository.get(5)
repository.delete(member)
Sqlite#persist
usesget_keys
for both column names and column values. So it'll never actually store any of your data. I'd suggest you spend a little more time making sure your code actually does what you want, and then post it again so we can review it properly. \$\endgroup\$