Rails 콘솔에서 데이터베이스 데이터 보기

9763 단어 Rails
이번에는 rails 컨트롤러로 DB의 데이터를 확인하는 방법을 배웠기 때문이다!
아, 데이터를 모델에 삽입한 후 디버깅을 해서 확인할 수 있기 때문에 상당히 도움이 되지 않는 기사가 될 수 있으니 용서해 주세요 (T.T)

모델 속성 및 데이터베이스 데이터 내용


이번에 사용한 모델과 데이터는 다음과 같다.
user.rb
class User < ApplicationRecord
  has_many :comment
end
#Userクラスのプロパティ
  t.string :user_name
  t.integer :age
comment.rb
class Comment < ApplicationRecord
  belongs_to :user
#Commentクラスのプロパティ
  t.string :text
사용자 테이블
user_name
age
산전
십팔
방울나무
이십
논밭
21
comments 표
user_id
text

산전 평어 1

산전

스즈키 의견
(데이터가 적합하지 않음)

여기서부터 컨트롤러에서 작동합니다.


레코드 하나만 읽어들이기

###userテーブルから山田のレコードを取得
user = User.find(1)
###SQLの実行クエリ
 SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
###取得したレコード内容
<id: 1, user_name: "山田", age: 18, created_at: nil, updated_at: nil>
###取得したレコードの年齢のみ表示
user.name
18
나는 상술한 조작을 한 번 실행한 적이 있다고 생각한다.
내용으로서 DB 명령에서 "users표의 id가 1인 기록을 가져옵니다"라고 하고 실례 변수에 저장합니다.
이 변수user는 산열 형식으로 데이터를 저장합니다.
따라서 이 데이터의 나이만 찾으려면 "user.age"를 입력하십시오.
키로서의 agy 가치의 18만 검색할 수 있습니다.

여러 레코드 가져오기

###userテーブル全てを取得
user = User.all
###SQLの実行クエリ
  SELECT `users`.* FROM `users`
###取得したレコード内容
 [#<User:0x00007f8cbb348bf0 id: 1, user_name: "山田", age: 18, created_at: nil, updated_at: nil>,
 #<User:0x00007f8cbb348b28 id: 2, user_name: "鈴木", age: 20, created_at: nil, updated_at: nil>,
 #<User:0x00007f8cbb348a60 id: 3, user_name: "田中", age: 21, created_at: nil, updated_at: nil>]
나는 만약 여러 개의 기록을 얻게 된다면 아마도 상술한 형식이 될 것이라고 생각한다.
여러 레코드의 데이터를 읽어들일 경우 데이터의 형태는 단일 레코드를 읽어들일 때와 다릅니다.
단일 기록에 대해 데이터의 형상은 산열이지만 여러 기록에 대해 데이터의 형상은 수조이다.
이것은 배열 중의 모든 기록의 인상이라고 생각하기 쉬울 것이다.
그러면 변수user에 있는 야마다 씨의 기록만 보이는 경우
산전 나이만 표시하는 방법은 다음과 같다.
###山田さんのレコードのみ表示
 user[0]
id: 1, user_name: "hajime", age: 18, created_at: nil, updated_at: nil>
###山田さんの年齢のみ表示
 user[0].age
18
산전의 나이만 표시하려면 변수user에 저장된 수조의 0번째
지정하다.
0 번째 배열에서 야마다 씨의 기록은 산열의 형식으로 저장되어 있다
데이터가 표시되면 "user[0].age"
주의)
데이터베이스에 있는 기록은 id 자동 번호의 번호를 가지고 있지만, 데이터베이스에 있는 id는 자동 번호의 0번째 번호가 존재하지 않습니다.
그러나 루비뿐만 아니라 그룹의 프로그램은 0번째부터 시작한다.

여러 테이블에서 관련 데이터 가져오기

###userテーブル全てを取得
user = User.all.includes(:comment)
###SQLの実行クエリ
  SELECT `users`.* FROM `users`
  SELECT `comments`.* FROM `comments` WHERE `comments`.`user_id` IN (1, 2, 3)
###取得したレコード内容
 [#<User:0x00007f8cbb348bf0 id: 1, user_name: "山田", age: 18, created_at: nil, updated_at: nil>,
 #<User:0x00007f8cbb348b28 id: 2, user_name: "鈴木", age: 20, created_at: nil, updated_at: nil>,
 #<User:0x00007f8cbb348a60 id: 3, user_name: "田中", age: 21, created_at: nil, updated_at: nil>]
상술한 것은users표 사용자와 관련된comment표의 기록과 함께
변수user에 가져오고 저장합니다.
이전과 달리 SQL의 실행 질의는 두 가지입니다.
주) 여기서부터는 항상 자신의 나쁨을 고민하고 싫어하는 곳(__)
그럼 이번에 얻은 기록에서 스즈키 평론의 기록이 나온다.
주) 상당히 높은 위치이지만 데이터베이스의 데이터는 데이터베이스의 데이터를 바탕으로 기재된다.
###鈴木さんのコメントしたレコードのみを表示
user[1].comment[0].text
鈴木コメント
###山田さんのコメントしたレコードかつ、2つ目のコメントのみを表示
uset[0].comment[1].text
山田コメント2
우선 스즈키의 댓글을 표시하는 사람부터 설명한다.
사용자 테이블에서 여러 개의 기록을 가져오기 전에 지난번과 같습니다
이번에는users표의 사용자와 관련된 평론도 함께 얻었기 때문에
user.all.includes (:comment)에서도comment표에서
링크 레코드를 가져오는 중입니다.
두루뭉술하지만
이 조회는 사용자 테이블에서 모든 기록을 검색합니다
SELECT users .* FROM usersusers표에서 가져온 기록만 가져오는 id와 1,2,3 관련 기록
SELECT comments .* FROM comments WHERE comments . user_id IN (1, 2, 3)
연관된 기록은 1건이라도 모두 배열된 형식으로 변수에 저장된다.
따라서 변수user에서 스즈키의 댓글만 표시하려면
사용자 그룹의 첫 번째 요소에 그룹이 있습니다. 이 그룹의 산열 키text에 접근할 때
스즈키 설명이 안전하게 표시됩니다.
user[1].comment[0]
그림으로 표현하면 이런 느낌이다.

요약!!


하하😩드디어 해결됐지만 이걸 하면 뭐가 좋을까?열다
나는 말하면 없을까 봐 두렵다.
컨트롤러로 변수를 디버깅하면 내용을 볼 수 있기 때문에 일부러 컨트롤러에서 할 필요도 없을 것 같습니다 (T.T)
이번에는 user와 관련된 기록이기 때문에 user는 1에 비해 여러 개의 comment가 있기 때문에 N
나는 마침내 N+1 문제를 알게 되었다.
실제로user와 관련된comment의 기록은 삽입하지 않아도 표시할 수 있습니다.
이전 파일에 테이블 연결을 설정했기 때문!
그러나comment표의 기록을 얻을 때마다 SQL 조회가 발생하기 때문에 성능이 나타나지 않습니다.
그럼요.웃다
모든 사용자의 의견을 얻을 때마다 검색이 실행되기 때문이다.그래서 처음부터 includes로 연결된 모든 기록
만약 얻게 된다면, 처음에는 조회만 실행하고, 매번 실행하지 않습니다.
다음은 경품 기사입니다.

삽입하지 않는 모드

###全てのusersテーブルのレコード取得
 user = User.all ###変数userに格納

###SQLの実行クエリ
SELECT `users`.* FROM `users`

###取得結果
[ id: 1, user_name: "山田", age: 18, created_at: nil, updated_at: nil>,
  id: 2, user_name: "鈴木", age: 20, created_at: nil, updated_at: nil>,
  id: 3, user_name: "田中", age: 21, created_at: nil, updated_at: nil>]

###山田コメントを取得
user[0].comment[0] ###変数userの配列0番目の中の配列0番目ユーザコメントを呼び出し
user[0].comment[1] ###変数userの配列0番目の中の配列1番目ユーザコメントを呼び出し
###SQLの実行クエリ
  SELECT `coments`.* FROM `coments` WHERE `coments`.`user_id` = 1
[ id: 1, text: "山田コメント1", user_id: 1, created_at: nil, updated_at: nil>, 
  id: 2, text: "山田コメント2", user_id: 1, created_at: nil, updated_at: nil> ]

###鈴木コメントを取得
user[1].comment[0] ###変数userの配列0番目の中の配列0番目ユーザコメントを呼び出し
###SQLの実行クエリ
  SELECT `coments`.* FROM `coments` WHERE `coments`.`user_id` = 2
[ id: 1, text: "鈴木コメント", user_id: 2, created_at: nil, updated_at: nil>]
모든 사용자는 조회를 가지고 있다.

삽입 모드

###全てのusersテーブルのレコード取得し、さらに紐付くcommentテーブルのレコード取得
 user = User.all.includes(:coment)

###SQLの実行クエリ
SELECT `users`.* FROM `users`
SELECT `coments`.* FROM `coments` WHERE `coments`.`user_id` IN (1, 2, 3)
[id: 1, user_name: "hajime", age: 18, created_at: nil, updated_at: nil>,
 id: 2, user_name: "yuta", age: 20, created_at: nil, updated_at: nil>,
 id: 3, user_name: "kazune", age: 22, created_at: nil, updated_at: nil>]

###山田コメントを取得
user[0].comment[0] ###変数userの配列0番目の中の配列0番目ユーザコメントを呼び出し
###鈴木コメントを取得
user[1].comment[0] ###変数userの配列0番目の中の配列0番目ユーザコメントを呼び出し
SQLのクエリは発生しない。
모든 사용자는 조회가 발생하지 않습니다.

좋은 웹페이지 즐겨찾기