로스앤젤레스

안녕, 세상!
나는 이미 한동안 블로그를 쓰지 않았다.저는 제 첫 번째 정점 프로젝트를 통과해서 기쁩니다. 이제 SQL(구조화된 조회 언어), ORM(대상 관계 맵), 동적 ORM, Rake와 활동 기록의 세계로 천천히 잠입합니다.
SQL을 이해하는 것은 데이터베이스 관리에 매우 중요합니다.이제 데이터베이스 입력을 만들고, 읽고, 업데이트하고, 삭제하는 방법을 알게 되었습니다.특히 DB Browser for SQLite님께 감사드립니다.일주일간의 접촉을 통해 저는 기본적인 SQL 조회, 집합 함수, 복잡한 연결, 그룹과 정렬 데이터에 만족합니다.ORM은 SQL(데이터베이스 시스템)과 루비 대상 프로그래밍(OOP)이 서로 통신하는 곳이다.Ruby는 이러한 데이터를 직접 저장하거나 관리하지 않습니다.그러나 놀라운 루비gemsqlite3과 데이터베이스 연결이 완전히 구축됨에 따라 루비OOP 방법으로 데이터베이스 입력을 CRUD할 수 있습니다.더 많은 데이터를 오래 유지하면 더욱 복잡한 응용 프로그램을 초래할 수 있기 때문에 ORM 디자인 모델은 업무를 실현하는 데 매우 중요하다.나는 추상적인 ORM의 메타프로그래밍이 매우 도전적이라는 것을 발견했다.초보 프로그래머로서 이 프로그래밍 연습은 내가 처음으로 접촉한 것이고 활동 기록이 무대 뒤에서 어떻게 일을 하는지 완전히 파악하는 좋은 기초이다.

활동 기록


Active Record는 데이터베이스와 Ruby 모델 간에 매핑을 생성합니다.VC(모델-보기-컨트롤러)에서 활동 기록은 ORM 프레임워크를 제공하는 모델입니다.나는 처음부터 사례 연구를 구축하여 활동 기록 메커니즘을 이해할 것이다.

우리는 모두 로스앤젤레스가 최근 2020년 NBA 우승을 차지했다는 것을 안다.2009년과 2010년 케비가 로스앤젤레스를 이끌고 우승을 차지한 이래 로스앤젤레스는 역사적으로 리그 1위에 복귀했다.오늘의 활약 기록은 로스앤젤레스의 통계 데이터에서 나왔다.우리는 AR 협회를 중점적으로 주목할 것이다. 주로 belongs_to, has_manyhas_many :through이다.나는 예상 대상 관계와 데이터베이스의 기본 모델과 구조를 제공했다.

로스앤젤레스 has_many명의 선수.로스앤젤레스 has_many명의 팬 :through명의 선수.
선수 belongs_to 로스앤젤레스.선수 has_many명의 팬.
belongs_to 선수.

Gemfile, Environment 및 Rakefile


나는 Gemfile에 우리가 필요로 하는gems를 설정한 다음에 bundle install에 설정했다.
source 'https://rubygems.org'

gem 'sqlite3'
gem 'pry'
gem 'rake'
gem 'activerecord', '<6.0.0'
gem 'sinatra-activerecord', :require => 'active_record'
config/environment.rb을 계속하려면 sqlite 데이터베이스와 Ruby OOP 모델 사이의 연결을 구축해야 합니다.
require 'rake'
require 'active_record'
require 'date'
require 'sinatra/activerecord'

require 'bundler/setup'
Bundler.require

Dir[File.join(File.dirname(__FILE__), "../app/models", "*.rb")].each {|f| require f}

ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'db/lakers.sqlite')
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
ActiveRecord::Base.logger 또는 SQL logger는 실행할 때마다 정보를 제공하는데 이것은 사용자가 데이터베이스 이전을 자주 실행할 때 매우 유용하다.
Rake는 Ruby 작업 관리 도구 중 하나입니다.rake db:migraterake console은 우리가 가장 흔히 볼 수 있는 레이크 임무이다.
require_relative './config/environment.rb'
require 'sinatra/activerecord/rake'

desc 'drop into the Pry console'
task :console do 
    Pry.start 
end
sinatra/activerecord/rake는 흔히 볼 수 있는 관리 작업을 제공합니다.터미널에서 rake-T를 입력하면 다음 내용이 표시됩니다.
rake console                # drop into the Pry console
rake db:create              # Creates the database from DATABASE_URL or config/database.yml ...
rake db:create_migration    # Create a migration (parameters: NAME, VERSION)
rake db:drop                # Drops the database from DATABASE_URL or config/database.yml fo...
rake db:environment:set     # Set the environment value for the database
rake db:fixtures:load       # Loads fixtures into the current environment's database
rake db:migrate             # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE...
rake db:migrate:status      # Display status of migrations
rake db:rollback            # Rolls the schema back to the previous version (specify steps w...
rake db:schema:cache:clear  # Clears a db/schema_cache.yml file
rake db:schema:cache:dump   # Creates a db/schema_cache.yml file
rake db:schema:dump         # Creates a db/schema.rb file that is portable against any DB su...
rake db:schema:load         # Loads a schema.rb file into the database
rake db:seed                # Loads the seed data from db/seeds.rb
rake db:setup               # Creates the database, loads the schema, and initializes with t...
rake db:structure:dump      # Dumps the database structure to db/structure.sql
rake db:structure:load      # Recreates the databases from the structure.sql file
rake db:version             # Retrieves the current schema version number
rake db:create_migration create_lakers을 입력하면 db/migrate 폴더 아래에 20201013230646_create_lakers.rb이라는 새 파일이 생성됩니다.타임 스탬프 차원 구조는 명명 약정에 매우 중요하다.그것은 연-월-날짜-시간-분-초로 표시됩니다.나는 현재 lakers표의 열과 데이터 형식을 채울 수 있다.
나는 또한 playersfans, 그리고 rake db:create_migration create_playersrake db:create_migration create_fans을 위해 두 번째와 세 번째 표를 만들 것이다.lakersplayers 이전에 fans표를 구축하는 것이 더 좋은 방법이다.lakers 테이블에는 외부 키나 의존 항목이 없습니다.playersfans은 모두 외부 키와 의존항이 있다.
class CreateLakers < ActiveRecord::Migration[5.2]
  def change
    create_table :lakers do |t|
        t.string :season
        t.integer :wins
        t.integer :losses
        t.string :coach 
    end 
  end
end

class CreatePlayers < ActiveRecord::Migration[5.2]
  def change
    create_table :players do |t|
      t.string :name
      t.integer :yrs_exp
      t.integer :jersey_number
      t.integer :laker_id
    end 
  end
end

class CreateFans < ActiveRecord::Migration[5.2]
  def change
    create_table :fans do |t|
      t.string :name
      t.integer :age
      t.integer :player_id
    end 
  end
end
파일을 저장하면 터미널에서 rake db:migrate 명령을 실행할 수 있습니다.레이크 명령 rake db:migrate:status을 사용하여 이중 검사를 진행하겠습니다.
database: db/lakers.sqlite

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20201013230646  Create lakers
   up     20201013230742  Create players
   up     20201014025021  Create fans
우리는 현재 이미 세 장의 포인트 랭킹 (로스앤젤레스, 선수, 팬) 을 성공적으로 만들었다.schema.rb 폴더 아래에 또 다른 새 파일 db이 생성되었습니다.이 파일은 우리가 데이터베이스를 업데이트할 때 자동으로 생성된 것이므로 변경하거나 수정해서는 안 된다.
ActiveRecord::Schema.define(version: 2020_10_14_025021) do

  create_table "fans", force: :cascade do |t|
    t.string "name"
    t.integer "age"
    t.integer "player_id"
  end

  create_table "lakers", force: :cascade do |t|
    t.string "season"
    t.integer "wins"
    t.integer "losses"
    t.string "coach"
  end

  create_table "players", force: :cascade do |t|
    t.string "name"
    t.integer "yrs_exp"
    t.integer "jersey_number"
    t.integer "laker_id"
  end

end

ActiveRecord 연결


Ruby 클래스 app/models/, laker.rbplayer.rb에 새 폴더 디렉터리 fan.rb을 만들었습니다.
class Laker < ActiveRecord::Base 
    has_many :players
    has_many :fans, through: :player
end

class Player < ActiveRecord::Base
    belongs_to :laker 
    has_many :fans
end

class Fan < ActiveRecord::Base 
    belongs_to :player
end
클래스 Laker, PlayerFan 및 그 관련성은 ActiveRecord::Base을 통해 AR宏을 계승한다.로스앤젤레스 has_many명의 선수(비선수).다원화된 명칭 시스템은 대상 관계를 구축할 때 신중하다.이는 선수 has_many 팬과 로스앤젤레스 has_manythrough: 선수에게도 적용된다.플레이어의 단수 사용법을 주의하세요.단수화와 복수화의 사용은 반드시 의미에서 예상한 대상과 일치해야 한다.
이것은 ActiveRecord::Base에서 계승된 클래스로 루비 메타프로그래밍 방법을 사용할 수 있습니다.

ActiveRecord 매크로(또는 메서드)

rake console을 실행하고 AR 매크로를 연습할 수 있습니다.
[1] pry(main)> Laker.methods.size
=> 637

[2] pry(main)> Player.methods.size
=> 625

[3] pry(main)> Fan.methods.size
=> 613

[4] pry(main)> Laker.methods - Player.methods
=> [:before_add_for_players,
 :before_add_for_players?,
 :before_add_for_players=,
 :after_add_for_players,
 :after_add_for_players?,
 :after_add_for_players=,
 :before_remove_for_players,
 :before_remove_for_players?,
 :before_remove_for_players=,
 :after_remove_for_players,
 :after_remove_for_players?,
 :after_remove_for_players=]
Rubygem Active Record원 프로그래밍의 미친 방식, 그리고 이 방법들을 우리 프로그래머들이 사용하기 쉽게 합니다.활동 기록은 우리가 저급 프로그래밍을 없애고 실현 방법을 깊이 연구할 수 있도록 한다.Laker종류는 637개의 방법을 내장하고 Player종류는 625개, Fan종류는 613개!Laker 클래스가 가지고 있는 다른 12가지 방법에 관심이 있다면pry 컨트롤러 [4]를 참조하십시오.
[5] pry(main)> latest_champ = Laker.new(season: "2019-20", wins: 52, losses: 19, coach: "Frank Vogel")
=> #<Laker:0x00007fc297985a88 id: nil, season: "2019-20", wins: 52, losses: 19, coach: "Frank Vogel">

[6] pry(main)> latest_champ.save
=> true

[7] pry(main)> latest_champ
=> #<Laker:0x00007fc297985a88 id: 1, season: "2019-20", wins: 52, losses: 19, coach: "Frank Vogel">

[8] pry(main)> previous_champ = Laker.create(season: "2009-10", wins: 57, losses: 25, coach: "Phil Jackson")
=> #<Laker:0x00007fc298378d60 id: 2, season: "2009-10", wins: 57, losses: 25, coach: "Phil Jackson">

[9] pry(main)> Laker.all
=> [#<Laker:0x00007fc2983a3cb8 id: 1, season: "2019-20", wins: 52, losses: 19, coach: "Frank Vogel">, #<Laker:0x00007fc2983a1e90 id: 2, season: "2009-10", wins: 57, losses: 25, coach: "Phil Jackson">]
pry 컨트롤러[5]와 [7]에서 Active Record은 우리에게 미리 프로그래밍된 읽기와 쓰기 방법 기능을 제공했다(각각 getter와setter).기억하고 계신다면 루비 방법 attr_reader, attr_writerattr_accessor을 사용하여 수동으로 연결을 구축했습니다..new 방법은 하나의 대상 실례를 실례화하고 .save 방법만 사용하여 데이터베이스에 저장한다.저장하면 id: 1 값이 제공됩니다.또는 .create 방법을 사용하여 실례화할 때 id값을 만듭니다.컨트롤러 [8] 를 참조하십시오.
프로그래머로서 우리는 id 값을 대상의 실례에 직접 조작하지 않고 활동 기록원 프로그래밍 방법으로 id 값을 실행하도록 합니다.이 개념은 id를 기본 정수 키로 사용함으로써 이전의 SQL 연습과 유사합니다.실행할 때 자체 조직 데이터 입력을 통해 우리의 데이터베이스는 쉽게 틀리지 않을 것이다.
[10] pry(main)> lebron = Player.new(name: "LeBron James", yrs_exp: 17, jersey_number: 23)
=> #<Player:0x00007f89c3b99200 id: nil, name: "LeBron James", yrs_exp: 17, jersey_number: 23, laker_id: nil>

[11] pry(main)> latest_champ.players << lebron
=> [#<Player:0x00007f89c3b99200 id: 1, name: "LeBron James", yrs_exp: 17, jersey_number: 23, laker_id: 1>]
<<(또는 밀기) 방법은 우리의 .save 방법과 유사하다.<< 방법의 단점 중 하나는 실행할 때마다 모든 플레이어의 실례를 되돌려준다는 것이다.현재 우리 팀에 몇 개의 명부가 있는지 상상해 보세요. 우리의 단말기가 막힐 수도 있습니다.활성 레코드 연관 메서드를 통해 Lebron 키 laker_id: 1이 자동으로 할당됩니다.
[12] pry(main)> ad = Player.all.build(name: "Anthony Davis", yrs_exp: 8, jersey_number: 3)
=> #<Player:0x00007f89c0e539d0 id: nil, name: "Anthony Davis", yrs_exp: 8, jersey_number: 3, laker_id: nil>

[13] pry(main)> ad.save
=> true

[14] pry(main)> ad
=> #<Player:0x00007f89c0e539d0 id: 2, name: "Anthony Davis", yrs_exp: 8, jersey_number: 3, laker_id: nil>
Player 클래스 중, 우리는 Player.all 방법과 .build을 사용하여 새로운 유저, Anthony Davis를 실례화할 수 있습니다..build은 새 객체만 실례화합니다..save 객체를 데이터베이스에 명시적으로 저장해야 합니다.저장하면 id 키가 id: 2에 분배됩니다.
[15] pry(main)> Player.find_or_create_by(name: "Kyle Kuzma", yrs_exp: 3, jersey_number: 0)
=> #<Player:0x00007f89c3d6b538 id: 3, name: "Kyle Kuzma", yrs_exp: 3, jersey_number: 0, laker_id: nil>

[16] pry(main)> Player.find_by(name: "Alex Caruso")
=> nil

[17] pry(main)> alex = latest_champ.players.build(name: "Alex Caruso", yrs_exp: 3, jersey_number: 4)
=> #<Player:0x00007f89c098e288 id: nil, name: "Alex Caruso", yrs_exp: 3, jersey_number: 4, laker_id: 1>

[18] pry(main)> alex.save
=> true

[19] pry(main)> Player.find_by(name: "Alex Caruso")
=> #<Player:0x00007f89c0c555e8 id: 4, name: "Alex Caruso", yrs_exp: 3, jersey_number: 4, laker_id: 1>
find_or_create_by 방법은 대상의 실례를 찾는 데 도움을 줍니다.만약 찾지 못한다면, 실례는 우리의 데이터베이스에 만들어져 저장될 것이다.컨트롤러 참조[15].또 다른 유사한 방법은 find_by이다. 우리는 아직 알렉스 카루소가 없기 때문에 0으로 돌아간다.
우리는 현재 Laker 유형의 대상 실례 latest_champ을 연결하여 players'실례를 구축하여 더욱 많은 창조성을 얻을 수 있다.Active Record는 laker_id: 1의 id에 따라 Alex Caruso의 latest_champ을 분배합니다. .build 방법은 대상의 실례를 저장하지 않기 때문에pry 컨트롤러에 있는 플레이어 id: nil[17]을 신속하게 알립니다.저장한 후에 우리는 find_by 방법으로 그 존재성을 다시 검사할 수 있다.
[20] pry(main)> david = alex.fans.create(name: "David", age: 37)
=> #<Fan:0x00007f89bf8c3c28 id: 1, name: "David", age: 37, player_id: 4>

[21] pry(main)> Laker.first.players.find(4).fans
=> [#<Fan:0x00007f89c3b590d8 id: 1, name: "David", age: 37, player_id: 4>]
Laker 클래스와 Player 클래스를 배울 때 전체 모델의 실현과 Active Record을 통해 CRUD 기능을 루비 OOP 논리에 어떻게 응용하는지 알게 될 것입니다.세 번째 Fan 클래스를 계속하면 Player 클래스를 통해 팬을 만드는 대상 실례를 만들고 Laker의 최근 2020선수권대회에서 한 선수의 특정 팬을 찾을 수 있습니다.
전체 폴더 구조의 차원 구조를 되돌아봅시다.Ruby OOP와 데이터베이스를 통합할 때 모델 구조와 조직은 처음부터 매우 중요하다.
> app/models
    laker.rb
    player.rb
> config
    environment.rb
> db
  > migrate
      20201013230646_create_lakers.rb
      20201013230742_create_players.rb
      20201014025021_create_fans.rb
    lakers.sqlite
    schema.rb
> Gemfile
> Gemfile.lock
> Rakefile 
앞에서 보듯이 우리는 수백 가지 원 프로그래밍 방법이 있는데, 나는 단지 몇 개만 응용했다.나에게 있어서 이것은 나로 하여금 우리의 기본 물체에 가까워지게 하기에 충분하다.나는 나의 활동 기록 사례 연구를 끝내고 바로 Sinatra로 뛰어갈 것이다.후트!
나는 마침내 자신을 평범한 옛 루비 대상(PORO)에서 고도로 성숙한 대상으로 끌어올렸다는 느낌이 들었다.나는 클래스 간의 관계를 명확하게 표현할 수 있으며, 저급 프로그래밍 방법을 구축하는 것을 걱정할 필요가 없다.Active Record에 대해 우리는 더욱 높은 추상적인 단계에서 조작한다.
외부 소스:
Active Record Basics
Los Angeles Lakers
fentybit | GitHub | |

좋은 웹페이지 즐겨찾기