로스앤젤레스
35787 단어 activerecordrubycodenewbiesql
나는 이미 한동안 블로그를 쓰지 않았다.저는 제 첫 번째 정점 프로젝트를 통과해서 기쁩니다. 이제 SQL(구조화된 조회 언어), ORM(대상 관계 맵), 동적 ORM, Rake와 활동 기록의 세계로 천천히 잠입합니다.
SQL을 이해하는 것은 데이터베이스 관리에 매우 중요합니다.이제 데이터베이스 입력을 만들고, 읽고, 업데이트하고, 삭제하는 방법을 알게 되었습니다.특히 DB Browser for SQLite님께 감사드립니다.일주일간의 접촉을 통해 저는 기본적인 SQL 조회, 집합 함수, 복잡한 연결, 그룹과 정렬 데이터에 만족합니다.ORM은 SQL(데이터베이스 시스템)과 루비 대상 프로그래밍(OOP)이 서로 통신하는 곳이다.Ruby는 이러한 데이터를 직접 저장하거나 관리하지 않습니다.그러나 놀라운 루비gem
sqlite3
과 데이터베이스 연결이 완전히 구축됨에 따라 루비OOP 방법으로 데이터베이스 입력을 CRUD할 수 있습니다.더 많은 데이터를 오래 유지하면 더욱 복잡한 응용 프로그램을 초래할 수 있기 때문에 ORM 디자인 모델은 업무를 실현하는 데 매우 중요하다.나는 추상적인 ORM의 메타프로그래밍이 매우 도전적이라는 것을 발견했다.초보 프로그래머로서 이 프로그래밍 연습은 내가 처음으로 접촉한 것이고 활동 기록이 무대 뒤에서 어떻게 일을 하는지 완전히 파악하는 좋은 기초이다.활동 기록
Active Record는 데이터베이스와 Ruby 모델 간에 매핑을 생성합니다.VC(모델-보기-컨트롤러)에서 활동 기록은 ORM 프레임워크를 제공하는 모델입니다.나는 처음부터 사례 연구를 구축하여 활동 기록 메커니즘을 이해할 것이다.
우리는 모두 로스앤젤레스가 최근 2020년 NBA 우승을 차지했다는 것을 안다.2009년과 2010년 케비가 로스앤젤레스를 이끌고 우승을 차지한 이래 로스앤젤레스는 역사적으로 리그 1위에 복귀했다.오늘의 활약 기록은 로스앤젤레스의 통계 데이터에서 나왔다.우리는 AR 협회를 중점적으로 주목할 것이다. 주로
belongs_to
, has_many
과 has_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:migrate
과 rake 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
표의 열과 데이터 형식을 채울 수 있다.나는 또한
players
과 fans
, 그리고 rake db:create_migration create_players
과 rake db:create_migration create_fans
을 위해 두 번째와 세 번째 표를 만들 것이다.lakers
과 players
이전에 fans
표를 구축하는 것이 더 좋은 방법이다.lakers
테이블에는 외부 키나 의존 항목이 없습니다.players
과 fans
은 모두 외부 키와 의존항이 있다.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.rb
및 player.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
, Player
과 Fan
및 그 관련성은 ActiveRecord::Base
을 통해 AR宏을 계승한다.로스앤젤레스 has_many
명의 선수(비선수).다원화된 명칭 시스템은 대상 관계를 구축할 때 신중하다.이는 선수 has_many
팬과 로스앤젤레스 has_many
팬 through:
선수에게도 적용된다.플레이어의 단수 사용법을 주의하세요.단수화와 복수화의 사용은 반드시 의미에서 예상한 대상과 일치해야 한다.이것은
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_writer
과 attr_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 | |
Reference
이 문제에 관하여(로스앤젤레스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fentybit/lakers-activerecord-base-2nj9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)