Created
July 11, 2017 14:19
-
-
Save oddlyfunctional/50977c186bad8a4493ab44399b2ad86c to your computer and use it in GitHub Desktop.
Modeling data with associations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative "patients_repository" | |
require_relative "rooms_repository" | |
require_relative "room" | |
require 'csv' | |
rooms_repository = RoomsRepository.new("rooms.csv") | |
patient_repository = PatientsRepository.new("patients.csv", rooms_repository) | |
room = Room.new(capacity: 10) | |
rooms_repository.add(room) | |
another_room = Room.new(capacity: 6) | |
rooms_repository.add(another_room) | |
p patient_repository.all |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Patient | |
def initialize(attributes = {}) | |
@name = attributes[:name] | |
@discharged = attributes[:discharged] || false | |
@room = attributes[:room] | |
end | |
def room=(room) | |
@room = room | |
end | |
def name | |
@name | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name | discharged | room_id | |
---|---|---|---|
John | false | 1 | |
Paul | false | 1 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative "patient" | |
class PatientsRepository | |
def initialize(csv_file_path, rooms_repository) | |
@csv_file_path = csv_file_path | |
@rooms_repository = rooms_repository | |
@patients = [] | |
load_csv | |
end | |
def all | |
@patients | |
end | |
def add(patient) | |
@patients << patient | |
save_csv | |
end | |
def load_csv | |
options = { headers: :first_row, header_converters: :symbol } | |
CSV.foreach("patients.csv", options) do |row| | |
patient = Patient.new(row) | |
room_id = row[:room_id].to_i | |
room = @rooms_repository.all.find { |room| room.id == room_id } | |
patient.room = room | |
room.add_patient(patient) | |
@patients << patient | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Room | |
class RoomFullError < Exception | |
end | |
attr_accessor :id | |
attr_reader :capacity | |
def initialize(attributes = {}) | |
@capacity = attributes[:capacity] | |
@patients = attributes[:patients] || [] | |
end | |
def full? | |
@capacity <= @patients.size | |
end | |
def add_patient(patient) | |
if full? | |
fail RoomFullError, "Room is full!" | |
else | |
@patients << patient | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
id | capacity | |
---|---|---|
1 | 2 | |
3 | 4 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative "room" | |
class RoomsRepository | |
def initialize(csv_file_path) | |
@csv_file_path = csv_file_path | |
@rooms = [] | |
load_csv | |
@next_id = all.last.id + 1 | |
end | |
def all | |
@rooms | |
end | |
def add(room) | |
room.id = @next_id | |
@rooms << room | |
save_csv | |
@next_id += 1 | |
end | |
def load_csv | |
options = { headers: :first_row, header_converters: :symbol } | |
CSV.foreach(@csv_file_path, options) do |row| | |
row[:capacity] = row[:capacity].to_i | |
room = Room.new(row) | |
room.id = row[:id].to_i | |
@rooms << room | |
end | |
end | |
def save_csv | |
CSV.open(@csv_file_path, "wb") do |csv| | |
csv << ["id", "capacity"] | |
all.each do |room| | |
p room.capacity | |
csv << [room.id, room.capacity] | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment