Life is journey of constant learnings and this is an attempt to keep track of at least some of those learnings in an attempt to be a better version of oneself everyday
The following features are available via both the Web app & in Mobile
- User sign up & sign in(Uses Hotwire Stimulus as needed)
- As part of a user sign up, an organization is created based on user name & it is associated with an appropriate membership
- Update User profile details(Uses Hotwire Turbo as needed)
- Add ability to create a new learning
- Sample Learnings & Learning Categories can be added through
rake db:seed - Additional learning categories can be currently added through
rails cbackend manually
- Sample Learnings & Learning Categories can be added through
- Learning Search implemented using Stimulus and related features like Stimulus Target
- Infinite scroll implementation using Turbo Frames and lazy loading
- Inline functionalities for - Learning creation, update using Turbo Streams
- Functionalities like Update make use of features like Morphing that allows one to preserve scroll position and provides a better UX in general(especially in Mobile)
- Learning deletion also implemented with Turbo Streams to give a more intuitive user experience
- Floating flash notifications implemented for operations like learning create, update & delete to give a much better User experience.
Entity Relationship Diagram
┌─────────────────────────────────┐
│ Users │
├─────────────────────────────────┤
│ id │
│ email │────────┐
│ encrypted_password │ │
│ first_name │ │
│ last_name │ │
│ personal_organization_id (FK) │─────┐ │ (FK - your "home" org, set once)
│ reset_password_token │ │ │
│ remember_created_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │ │
│ has_many │ │
│ :memberships │ │
│ │ │
▼ │ │
┌─────────────────────────────────┐ │ │
│ Memberships │◄────┘ │
├─────────────────────────────────┤ │
│ id │ │
│ member_id (FK) │────────┘ ← This IS your "organization_ids"!
│ organization_id (FK) │─────┐
│ learnings_count │ │ (counter cache)
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
▲ │
│ │
│ has_many │
│ :memberships │
│ │
│ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Organizations │ │ │
├─────────────────────────────────┤ │ │
│ id │ │ │
│ name │ │ │
│ owner_id (FK) │──┘ ─→ Users (who created it) │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learnings │
│ │
▼ │
┌─────────────────────────────────┐ │
│ Learnings │ │
├─────────────────────────────────┤ │
│ id │ │
│ lesson │ │
│ description │ │
│ creator_id (FK) │────────────────────────────────────┘
│ last_modifier_id (FK) │───────┐ ─→ Users
│ organization_id (FK) │ │
│ learning_category_ids (array) │ │
│ deleted_at │ │
│ created_at │ │
│ updated_at │ │
└─────────────────────────────────┘ │
│ │
│ has_many │
│ :learning_categorizations │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategorizations │ │
│ (Join Table) │ │
├─────────────────────────────────┤ │
│ id │ │
│ learning_id (FK) │ │
│ category_id (FK) │───┐ │
│ deleted_at │ │ │
│ created_at │ │ │
│ updated_at │ │ │
└─────────────────────────────────┘ │ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ LearningCategories │ │
├─────────────────────────────────┤ │
│ id │ │
│ name │ │
│ description │ │
│ organization_id (FK) │───┐ │
│ creator_id (FK) │───┼───┘
│ last_modifier_id (FK) │───┘ ─→ Users
│ deleted_at │
│ created_at │
│ updated_at │
└─────────────────────────────────┘
View App related screenshots
-
Update Learnings Inline & confirm updates with Floating Notifcations
-
Learnings Rendered in Mobile View
- Search learnings via Mobile view
- Learning related Floating Notifications in Mobile view
- Implementing Learning Categories, Memberships & Organisations fully pertaining to a user's learning is a current WIP
- Login based on current organization needs to be implemented. It currently only takes user credentials for login and it falls back to the personal organization for the user until we explicitly implement this in the login flow
- Replace acts_as_paranoid with discard gem as that's more flexible & provides better future readynesss in terms of long term extendability(to allow support of more features etc.,) and maintainability
load_learning_categories(used inLearningsController) currently loads 100 learning categories. We can improve this further by providing UI options in appropriate parts of the app to filter and search learnings by other learning categories- Log exceptions to an error handling service like Sentry so that they can be acted upon proactively towards a resolution
- This app uses Ruby 3.3.6 & Rails 8.1.1
- Run
bundle installfrom a project's root directory to install the related dependencies.
- From the project root directory:
- Create the Database Schema with:
rake db:createandrake db:migrate
- Create the Database Schema with:
- In order to get started with using the app with an existing user, one could use the
rake db:seed - Additional learning categories can be currently added through
rails cBE manually
- Start the rails app with:
bin/dev
Please note: This command also bundles the latest CSS & JS code that comes along/regularly changes throughout the development lifecycle of an app
- One can run the tests from the project root directory with the command
rspec
- One can benefit with more consistent and better quality Ruby code with
rubocop -a&rubocop -Ato auto fix rubocop specific lint issues
- One can encourage use of best practices & catch common errors to improve view related code(as mentioned docs here)) regularly by using the Herb linter via the command
npx @herb-tools/linter app/views/ --fix






