루비, 액티브 레코드, 시나트라

3689 단어 ruby
Reactfrontend를 지원하기 위해 Sinatra 및 Active Record로 웹 기본 API를 구축했습니다. 여기서는 이 애플리케이션의 서버 측 구축에서 얻을 수 있는 몇 가지 주요 내용을 살펴보겠습니다.

일대다 관계



이 데이터베이스의 테이블은 일대다 관계를 가집니다. 나는 두 개의 테이블, 산책로 및 운동 선수를 만들었습니다. 하나의 트레일은 많은 운동 선수에게 "속합니다". 아래의 엔터티 관계 다이어그램은 외래 키trail_id가 트레일의 id에 연결된 선수 테이블에 있음을 보여줍니다.

엔티티 관계 다이어그램:





활성 레코드



app/models 파일에서 두 클래스, 운동 선수 및 트레일 간의 관계를 정의하기 위해 Ruby gem 개체 관계형 매퍼인 활성 레코드에서 상속합니다.

class Athlete < ActiveRecord::Base
    belongs_to :trail
end



class Trail < ActiveRecord::Base
    has_many :athletes
end


Rake 명령을 사용하여 마이그레이션 파일을 생성합니다.bundle exec rake db:create_migration NAME=create_athletes
db/migrate 파일에서 데이터베이스 테이블의 구조를 정의합니다.

class CreateAthletes < ActiveRecord::Migration[6.1]
  def change
    create_table :athletes do |t|
      t.string :name
      t.string :time
      t.integer :trail_id
      t.boolean :unsupported
      t.timestamps
    end
  end
end


마이그레이션 파일 이름에 snake_case를 사용하고 클래스 이름에 CamelCase를 사용하고 마이그레이션 파일의 타임스탬프를 그대로 유지하여 Active Record의 명명 규칙을 따르는 것이 중요합니다.

테이블 이름을 복수로 정의하고 클래스 이름을 단수로 정의하는 것도 중요합니다. 테이블 관계를 정의할 때 단일 트레일belongs_to 및 복수 선수has_many는 테이블을 연결할 때 정의합니다.

Active Record는 데이터 간의 연결을 인식하기 위해 이러한 명명 규칙을 예상합니다. "구성보다 관례". 마이그레이션 파일 타임스탬프를 통해 Active Record는 버전 제어/스키마를 관리할 수 있습니다.

app/controllers/application_controller 파일에서 프런트엔드(View)가 데이터베이스(Model)에 연결하기 위해 Sinatra(Controller)에서 상속합니다.



schema.rb 파일은 데이터베이스의 현재 버전을 보여줍니다. 버전 번호는 Active Record가 버전 제어를 유지하는 방법인 마이그레이션 파일의 타임스탬프에 해당합니다.
ActiveRecord::Schema.define(version: 2022_07_20_184513) do
CRUD 작업을 처리하기 위해 동적 라우팅을 사용합니다. 예를 들어 클라이언트 측에서 POST 요청은 다음과 같습니다.

    const handleAddTrail = (newTrail) => {
      fetch("http://localhost:9292/trails", {
          method: 'POST',
          headers: { 
            "Content-Type": "application/json", 
          },
          body: JSON.stringify(newTrail),
        })
        .then(r => r.json())
        .then((newTrail) => handleAddTrailToTrails(newTrail))
  }


서버 측:

  post '/trails' do
    trail = Trail.create(
      name: params[:name],
      location: params[:location],
      distance: params[:distance],
      elevation_gain: params[:elevation_gain]
    )
    trail.to_json(include: :athletes)
  end


위의 POST 요청 예제에서 include:를 사용하여 테이블 간에 연결된 데이터에 액세스하는 것을 기억하는 것이 중요합니다. 그렇지 않으면 이 예에서 반환된newTrail 개체에 선수 배열 []이 포함되지 않습니다.

액티브 레코드와 시나트라에 대한 전반적인 생각



코드를 배우고 데이터베이스를 만드는 것은 이러한 도구를 사용하여 지나치게 복잡한 프로세스가 아닙니다. 내가 끊고 있던 문제는 백엔드의 파일 구조와 명명 규칙의 특수성이었습니다.
또한 요청을 처리하기 위해 application_controller 파일의 많은 코드로 시작했는데 관련 데이터가 운동선수로부터 필요한 모든 데이터를 얻기 위해 trails 테이블에서 초기 가져오기만 필요하다는 것을 깨닫기 전에 시작했습니다.

좋은 웹페이지 즐겨찾기