Creating a Simple Library Management System in Ruby

Library Management System

Creating a Simple Library Management System in Ruby

Introduction

Library management systems are essential for handling the complex processes involved in maintaining a library. These systems help in organizing, managing, and tracking library resources efficiently. In this article, we will guide you through building a simple library management system using Ruby, a dynamic, open-source programming language known for its simplicity and productivity. We will cover the key components required for the system, including adding and managing books, registering users, and tracking borrowed books.

Palindrome Checker in Ruby

Why Ruby?

Ruby is an excellent choice for this project due to its readability and ease of use. Its elegant syntax is natural to read and easy to write, making it ideal for beginners and experienced developers alike. Moreover, Ruby’s powerful libraries and frameworks simplify the development process, allowing us to focus on the core functionality of the library management system.

Setting Up the Environment

Before we start coding, let’s set up the development environment. Ensure that you have Ruby installed on your system. You can download Ruby from the official website or use a version manager like RVM (Ruby Version Manager) to install and manage different versions of Ruby.

$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin20]

If Ruby is not installed, you can install it using RVM with the following commands:

$ \curl -sSL https://get.rvm.io | bash -s stable
$ rvm install ruby
$ rvm use ruby --default
$ ruby -v

Creating the Project Structure

Let’s start by creating a directory for our project and setting up the basic structure:

$ mkdir library_management_system
$ cd library_management_system
$ mkdir lib
$ touch lib/book.rb lib/user.rb lib/library.rb main.rb

Defining the Book Class

The first component we need is the Book class. This class will handle all the attributes and methods related to books in our library.

# lib/book.rb
class Book
  attr_accessor :title, :author, :isbn, :status

  def initialize(title, author, isbn)
    @title = title
    @author = author
    @isbn = isbn
    @status = 'available'
  end

  def to_s
    "Title: #{@title}, Author: #{@author}, ISBN: #{@isbn}, Status: #{@status}"
  end
end

Defining the User Class

Next, we’ll create the User class to handle user information and borrowed books.

# lib/user.rb
class User
  attr_accessor :name, :user_id, :borrowed_books

  def initialize(name, user_id)
    @name = name
    @user_id = user_id
    @borrowed_books = []
  end

  def borrow_book(book)
    if book.status == 'available'
      book.status = 'borrowed'
      @borrowed_books << book
    else
      puts "Sorry, the book '#{book.title}' is currently unavailable."
    end
  end

  def return_book(book)
    if @borrowed_books.include?(book)
      book.status = 'available'
      @borrowed_books.delete(book)
    else
      puts "You haven't borrowed the book '#{book.title}'."
    end
  end

  def to_s
    "Name: #{@name}, User ID: #{@user_id}, Borrowed Books: #{@borrowed_books.map(&:title).join(', ')}"
  end
end

Defining the Library Class

The Library class will manage the collection of books and users. It will include methods to add books, register users, and display the library’s inventory and user information.

# lib/library.rb
class Library
  attr_accessor :books, :users

  def initialize
    @books = []
    @users = []
  end

  def add_book(book)
    @books << book
  end

  def register_user(user)
    @users << user
  end

  def find_book_by_title(title)
    @books.find { |book| book.title.downcase == title.downcase }
  end

  def find_user_by_id(user_id)
    @users.find { |user| user.user_id == user_id }
  end

  def display_books
    @books.each { |book| puts book }
  end

  def display_users
    @users.each { |user| puts user }
  end
end

Implementing the Main Program

Now, we will create the main.rb file, which will serve as the entry point for our library management system. This file will handle user interactions and utilize the classes we have defined.

# main.rb
require_relative 'lib/book'
require_relative 'lib/user'
require_relative 'lib/library'

library = Library.new

def menu
  puts "Library Management System"
  puts "1. Add Book"
  puts "2. Register User"
  puts "3. Borrow Book"
  puts "4. Return Book"
  puts "5. Display Books"
  puts "6. Display Users"
  puts "7. Exit"
  print "Choose an option: "
  gets.chomp.to_i
end

loop do
  case menu
  when 1
    print "Enter book title: "
    title = gets.chomp
    print "Enter book author: "
    author = gets.chomp
    print "Enter book ISBN: "
    isbn = gets.chomp
    book = Book.new(title, author, isbn)
    library.add_book(book)
    puts "Book added successfully."

  when 2
    print "Enter user name: "
    name = gets.chomp
    print "Enter user ID: "
    user_id = gets.chomp
    user = User.new(name, user_id)
    library.register_user(user)
    puts "User registered successfully."

  when 3
    print "Enter user ID: "
    user_id = gets.chomp
    user = library.find_user_by_id(user_id)
    if user
      print "Enter book title: "
      title = gets.chomp
      book = library.find_book_by_title(title)
      if book
        user.borrow_book(book)
        puts "Book borrowed successfully."
      else
        puts "Book not found."
      end
    else
      puts "User not found."
    end

  when 4
    print "Enter user ID: "
    user_id = gets.chomp
    user = library.find_user_by_id(user_id)
    if user
      print "Enter book title: "
      title = gets.chomp
      book = library.find_book_by_title(title)
      if book
        user.return_book(book)
        puts "Book returned successfully."
      else
        puts "Book not found."
      end
    else
      puts "User not found."
    end

  when 5
    library.display_books

  when 6
    library.display_users

  when 7
    puts "Exiting the system. Goodbye!"
    break

  else
    puts "Invalid option. Please try again."
  end
end

Running the Program

To run the program, navigate to the project directory and execute the main.rb file:

$ ruby main.rb

You will be presented with a menu to interact with the library management system. You can add books, register users, borrow and return books, and display the current inventory and user information.

Enhancing the System

While the basic functionality is now in place, there are several enhancements and features you can add to make the system more robust and user-friendly:

  1. Persistent Storage: Currently, the data is stored in memory and will be lost when the program exits. Implementing a database or file storage system will allow the data to persist across sessions.
  2. User Authentication: Adding a login system for users and administrators can help secure the system and provide personalized experiences.
  3. Search and Filter: Implementing more advanced search and filter options for books and users can make the system more efficient.
  4. Overdue Books: Adding functionality to track overdue books and notify users can improve the system’s usability.
  5. Graphical User Interface (GUI): Creating a GUI using libraries like Ruby GTK or Ruby Shoes can make the system more accessible to users who are not comfortable with command-line interfaces.

Conclusion

Building a simple library management system in Ruby is a great way to learn and practice object-oriented programming principles. By breaking down the system into manageable components and implementing each part step-by-step, we can create a functional and efficient application. This project also provides a foundation for further enhancements and more complex features, making it a valuable learning experience for developers at all levels.