어떻게 Ruby(Rails)로 SQL을 만듭니까?

7044 단어 Rails
액티브 레코드라고 불리는 것으로 SQL이 발매되고 있다.
"Ruby와 SQL의 번역기"와 유사한 것
Rails 정의 모델을 사용하면 SQL을 쉽게 배포할 수 있습니다.
※ 모델: 데이터베이스에 접근하기 위한 클래스

각양각색
창설
User.create(name:'소전', 이메일:'[email protected])
INSERT INTO
  `users` (`name`, `email`, `created_at`, `updated_at`)
VALUES
  (
    '小田',
    '[email protected]',
    '2021-07-30 09:18:57',
    '2021-07-30 09:18:57'
  )
찾다
User.all
SELECT `users`.* FROM `users`
User.first
SELECT  `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
User.find(1)
SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
User.where
SELECT  `users`.* FROM `users` WHERE `users`.`title` = '小田' LIMIT 1
매우 편리하다
내부 결합
■joins
User.joins(:user_work_experiences).where(user_work_experience: { id: 1 })
SELECT
  `users`.*
FROM
  `users`
  INNER JOIN `user_work_experiences` ON `user_work_experiences`.`user_id` = `users`.`id`
WHERE
  `user_work_experience`.`id` = 1
외부 연결
■eager_load
User.eager_load(:user_work_experiences)
SELECT
  `users`.*,
  `user_work_experiences`.*,
FROM
  `users`
  LEFT OUTER JOIN `user_work_experiences` ON `user_work_experiences`.`user_id` = `users`.`id`
eager_load도 목적지의 표 정보를 얻을 수 있지만 Joins를 진행할 수 없습니다
joins 및 사용자work_experiences.job_id를 가져올 수 없습니다.
NG
User.joins(:user_work_experiences).where(user_work_experience: { id: 1 }).job_id

OK
User.eager_load(:user_work_experiences).where(user_work_experience: { id: 1 }).job_id
기타
preload
User.preload(:user_work_experiences)
SELECT  `users`.* FROM `users`;

SELECT
  `user_work_experiences`.*
FROM
  `user_work_experiences`
WHERE
  `user_work_experiences`.`user_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
eager_load와preload의 차이 사용
데이터량이 방대한 상황에서proeload, eager어쨌든load는 많은 메모리를 필요로 한다.
따라서 관련 종류에 따라 구분해서 사용해야 한다.
1 대 1 또는 1 대 N 연결 시 eagerload
데이터 양이 증가하더라도 SQL을 한 번 합쳐서 얻는 것이 더 효율적이기 때문에 eager잘 갔어.
N 대 N의 연관성은 proeload입니다.
eager_로드보다 프리로드 분할이 SQL을 얻기 때문에 응답 시간이 빨라지기 때문에 프리로드가 좋다.
결점
ActiveRecord에 지나치게 의존하면 SQL 자체의 이해가 무시됩니다.

좋은 웹페이지 즐겨찾기