Skip to content

Instantly share code, notes, and snippets.

@clupprich
Created March 15, 2021 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clupprich/4e609581f5c39f2fddaaa284b0f9f67d to your computer and use it in GitHub Desktop.
Save clupprich/4e609581f5c39f2fddaaa284b0f9f67d to your computer and use it in GitHub Desktop.
A single file Rails application setting up the DB, a few models, running minitest and finally starting up a Rails server
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
gem "rails"
gem "pg"
end
require "active_record"
require "action_controller/railtie"
ActiveRecord::Base.establish_connection(adapter: "postgresql", database: "railstestdb")
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :books, force: true do |t|
t.string :name
t.timestamps
end
create_table :users, force: true do |t|
t.string :name
t.timestamps
end
create_table :readings, force: true do |t|
t.references :book
t.references :user
t.timestamps
end
end
class Book < ActiveRecord::Base
has_many :readings
has_many :users, through: :readings
def self.read_by(*users)
includes(:readings).where(readings: { user_id: users })
end
end
class User < ActiveRecord::Base
has_many :readings
has_many :books, through: :readings
end
class Reading < ActiveRecord::Base
belongs_to :book
belongs_to :user
end
class LibraryApp < Rails::Application
secrets.secret_token = "secret_token"
secrets.secret_key_base = "secret_key_base"
config.logger = Logger.new($stdout)
Rails.logger = config.logger
routes.draw do
resources :books, only: [:index]
end
end
class BooksController < ActionController::Base
def index
@books = Book.all
render json: @books
end
end
require "minitest"
class BookTest < Minitest::Test
def test_read_by
book1 = Book.create!(name: 'Generation X')
book2 = Book.create!(name: 'Microserfs')
book3 = Book.create!(name: 'American Polaroids')
user1 = User.create!(name: 'Daniel')
user2 = User.create!(name: 'Susan')
user3 = User.create!(name: 'Todd')
Reading.create!(book: book1, user: user1)
Reading.create!(book: book2, user: user2)
Reading.create!(book: book2, user: user3)
books = Book.read_by(user2)
assert_equal books, [book2, book3]
end
end
exit_code = Minitest.run
exit exit_code unless exit_code
require "rails/command"
require "rails/commands/server/server_command"
options = {
app: LibraryApp,
Host: '0.0.0.0'
}
Rails::Server.new(options).start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment