Skip to content

Instantly share code, notes, and snippets.

@clupprich
Created March 15, 2021 08:39
Show Gist options
  • Select an option

  • Save clupprich/4e609581f5c39f2fddaaa284b0f9f67d to your computer and use it in GitHub Desktop.

Select an option

Save clupprich/4e609581f5c39f2fddaaa284b0f9f67d to your computer and use it in GitHub Desktop.

Revisions

  1. clupprich created this gist Mar 15, 2021.
    103 changes: 103 additions & 0 deletions railsfile_books.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,103 @@
    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