Ruby 활성 레코드 치트 시트

안녕하세요. Karter의 Cheat Sheets에 다시 오신 것을 환영합니다.

오늘 치트 시트에서는 Ruby의 활성 레코드 기능의 시작 단계를 간략하게 살펴보겠습니다.

이것을 복사하여 코드 편집기에 붙여넣으면 모든 예쁜 색상을 볼 수 있습니다!

--------------------SET UP--------------------

# 1. Run in console to install gems in Gemfile bundle install

# 2. do migrations (see RAKE CONSOLE COMMANDS & MIGRATION FILES)
    # Verify schema file is correct before continuing

# 3. set up Class files if not set up (see CLASSES and everything below it)
    # Set up the has_many & belongs_to relationships first

# 4. set up seeds.rb file if not set up for running tests (see SEED FILE)
    # Run in console to seed data
    bundle exec rake db:seed

# 5. Run console (should have pry in Rakefile task) (see RUNNING TESTS)
    bundle exec rake console
    # can put binding.pry in code anywhere but reset console first
    # to get out of pry => control + D (on mac)

    #reset console/seeds if needed 
    rake db:reset

    # clear console of previous tests (!does not reset console!)
    clear

    # Returns all the methods you can use
    User.methods 
    # OR
    Ruby.methods

-----------RAKE CONSOLE COMMANDS-------------

#          where v      v what do      name of file v
bundle exec rake db:create_migration NAME=create_artists

# write in generated file then can migrate using command below
bundle exec rake db:migrate

# check status of migration
bundle exec rake db:migrate:status

# if mistake, take back mistakes
bundle exec rake db:rollback

---------------MIGRATION FILES---------------

# after doing => bundle exec rake db:create_migration NAME=______

class CreateArtists < ActiveRecord::Migration[6.1]   
  def change

    # create a table called artists with columns (t)
    create_table :artists do |t|

      # v data type 
      t.string :name
      #           ^name of data (column name)

      # v lots of different data types
      t.string :birthdate
      t.integer :age
      t.float :price
      t.datetime :release_date
      t.text :description
      t.boolean :cool 

      t.timestamps
      # ^ creates a created_at column and a updated_at column

      # id column auto generated for every table
      # DO NOT put symbols as part of a data name, 0/10 do not recommend
    end
  end
end

# in def change can also do these if not making table:

#            v table   v new column    v data type
add_column :artists, :favorite_food, :string

#                v table   v column    v new data type
change_column :artists, :birthdate, :datetime

---------------RUNNING TESTS------------------

# if testing an instance's association 
# EX: show all pets that belong to shelter
Shelter.first.pets
# => Class that owns thing . first instance . Class that belongs to it (lowercase and plural)

# if testing the Class method
# EX: return the oldest pet
Pet.oldest
# => Class . method in class

-----------------SEED FILE--------------------
# make a file called seeds.rb in db folder

# if you want to use id from one class in another, save to variable
t1 = Class1.create(key:"value")

# ids are auto generated, so no need to make them
Class2.create(attached_id: t1.id, key1:"value1", key2:2, key3:false)

# highly recommend doing:
puts "Done!"

# so that you know it didn't freeze on you.

------------------CLASSES------------------

# Must inherit Active Record in order to get all the cool shit
class Dog < ActiveRecord::Base 
    belongs_to :pet 
    # Dog is part of Pet

    has_many :appointments
    # Dog has many appointments

    has_many :doctors, through: :appointments
    # Dog has many doctors through appointments

    @@dog_count = 0
    # class variable

    def initialize
        # upon initialization
        super
        # do *initialize* from inherited files first
        # can take an arg EX: super(name)

        @@dog_count += 1
        # add 1 to class variable
    end

    def get_adopted(owner_name)
        self.owner = owner_name
        # self refers to the instance of Dog that is being called
    end
end

# objects in Dog are accessed by dot notation
fido = Dog.new("Fido")
# fido = new instance of Dog, passing in "Fido" as name

fido.get_adopted("Sophie")
# sets "Sophie" as owner_name

------------------METHODS------------------

#                               v default value for name
def greet_with_default (name="programmer")
    puts "Hello, #{name}!"
end
# def -> identifies it as a method
    # parentheses are optional if not passing data
    # last line of a method is the return value unless you put return
# end -> end of method (always needed)

------------------------------------------

# keyword args make it less likely to break
def happy_birthday(person:, current_age:)
  puts "Happy Birthday, #{person}"
  current_age += 1
  puts "You are now #{current_age} years old"
end

# call the method with the keywords and values
happy_birthday(current_age: 31, person: "Carmelo Anthony")

------------------------------------------

def self.method 
    self.order
end
# ^self refers to class in both because it's in method name

def method
    self
end
# ^self refers to an instance because it's not in method name

=================ACTIVE RECORD METHODS======================
# more info:
# https://guides.rubyonrails.org/active_record_querying.html
# https://rubydoc.info/stdlib/core/Enumerable:group_by
# https://apidock.com/ruby/Enumerable/group_by

# vv inherit ActiveRecord to get the following vv #

--------attr_accessors are built into Active Record--------

# Class => substitute name of class you want to use
# Class_Instance => substitute instance of a class 

# Can combine things listed below!!

Class.new(___:___)
# creates new instance of class using variables listed in (__)
    # ex: Class.new(name: 'Jon')
# not saved in db until run .save
# can save to var to change instance variables separately

Class_Instance.save
# save changes of an instance to the database

Class.create(___:___)
# create a new entry of Class in database
# .new + .save put together
    # ____ => variables, ex: Class.create(name: 'Jon')

Class.update(____:____)
# updates all instance vars to new data
# also works on instance basis: self.update(__:__) or Class.first.update(__:__)

Class_Instance.update(_____:_____)
# updates instance to new data

Class.all
# returns all the records from the table as instances of Class

Class.column_names
# retrieves a list of all the columns in the table

Class.find(_)
# retrieve a Class object from database by id (_)

Class.find_by(____:____)
# find by any attribute
    # ____ => variables, ex: Class.find_by(name: 'Jon')
    # returns nil if not found

Class.pluck(____)
# returns array of all _____ of the instances of Class
    # EX: Class.pluck(:name) => returns a list of all the instance names in Class

Class.where(___:___)
# find but returns list of all that match query (___:___)

Class.find_or_create_by(___:___)
# Creates instance of class if it does not exist
    # ____ => variables, ex: Class.find_or_create_by(name: 'Jon')

Class.order(___)
# orders the instances for Class by ____
    # EX: Class.order(:name) => orders instances by name

Class.first
# gets first instance created, can do second, third, etc

Class.last
# gets last instance created

Class_Instance.destroy 
# deletes instance

Class.destroy
# deletes last instance created (returns deleted instances)

Class.delete_all
#deletes all instances (returns number of instances deleted)

Class.destroy_all
# deletes all instances (returns deleted instances)

Class.sum(___)
# adds up all of the keys that match

Class.all.length
# returns num of instances in Class

Class_Instance.group_by {|p| p._____}
# EX: (1..6).group_by { |i| i%3 }   
#=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}



빠진 것이 있으면 알려주세요 :)

좋은 웹페이지 즐겨찾기