menu

Rails5 Model - Active Record 기본

Rails5에서 model을 개발하는데 필요한 Active Record에 대해서 정리하겠습니다.


데이터 취득 기본
  • 기본 키를 이용해서 검색 - find 메소드

    가장 기본적인 find 메소드입니다.

     find(keys)
     # keys:기본 키(배열로도 지정 가능)
    

    Rails : User.find([2, 5, 10])

    변환된 SQL : SELECT users.* FROM users WHERE users.id IN (2, 5, 10)


  • 임의의 키를 이용해서 검색 - find_by 메소드

    find 메소드에서 파생된 메소드로, 임의의 열을 키로 테이블을 검색해서 처음에 검색된 1건만 취득합니다.

     find_by(key: value)
     # key : 검색할 필드명, value : 검색값
    

    Rails : User.find_by(name: 'kim', city: 'hiroshima')

    변환된 SQL : SELECT users.* FROM users WHERE users.name = 'kim' AND users.city = 'hiroshima' LIMIT 1


보다 복잡한 조건을 이용해서 검색하기 - Query Method

Query Method를 이용하여, 보다 복잡한 조건식을 지정하거나 정렬, 그룹화, 범위 추출, 결합 등을 할 수 있습니다.

Method 개요
where 필터링 조건
not 부정 조건
or or 조건
order 정렬
reorder 정렬식 덮어쓰기
select 열 지정
distinct 중복 없이 레코드 취득
limit 추출하고자 하는 레코드 수 제한
offset 추출하고자 하는 레코드의 시작점, limit와 같이 사용됨
group 특정 키를 이용하여 결과를 그룹핑
having GROUP BY에 추가 제약을 설정
joins 다른 테이블과 결합
left_outer_joins 다른 테이블과 left outer join
includes 관련있는 모델을 한꺼번에 취득
readonly 취득한 오브젝트를 읽기 전용으로
none 빈 결과셋을 취득


위와 같이 다양한 종류의 Query Method가 존재하며, 위의 메소드들을 사용하면 ActiveRecord::Relation 오브젝트가 리턴됩니다.

  • where 메소드

    사용법 1

    Rails : User.where(city: ['hiroshima', 'seoul'])

    변환된 SQL : SELECT users.* FROM users WHERE users.city IN ('hiroshima', 'seoul')


    사용법 2

    Rails : User.where('city = ?', 'hiroshima')

    변환된 SQL : SELECT users.* FROM users WHERE users.city = 'hiroshima'


  • not 메소드

    Rails : User.where.not(city: 'hiroshima')

    변환된 SQL : SELECT users.* FROM users WHERE users.city != 'hiroshima'


  • or 메소드 (Rails 5 이상)

    Rails : User.where(city: 'hiroshima').or(User.where(name: 'kim'))

    변환된 SQL : SELECT users.* FROM users WHERE ( users.city = 'hiroshima' OR users.name = 'kim' )


  • order 메소드

    Rails : User.where(city: 'hiroshima').order(name: :desc)

    변환된 SQL : SELECT users.* FROM users WHERE users.city = 'hiroshima' ORDER BY users.name DESC


  • select 메소드

    Active Record는 기본적으로 모든 열을 취득합니다.(SELECT * FROM …)

    하지만 레코드의 모든 열이 필요하지 않는 경우도 많으므로, 취득하고자 하는 특정 열을 명시적으로 지정하는 것도 가능합니다.

    Rails : User.where(city: 'hiroshima').select(:name, :type)

    변환된 SQL : SELECT users.name, users.type FROM users WHERE users.city = 'hiroshima'


  • distinct 메소드

    결과셋으로부터 중복된 행을 소거합니다.

    Rails : User.select(:name).distinct

    변환된 SQL : SELECT DISTINCT users.name FROM users


  • none 메소드

    빈 결과셋을 취득합니다.

    view에 빈 Relation(NullRelation)을 전달함으로써, 에러를 방지하고자 할 때 사용합니다.

    Rails : User.none



Written on July 1, 2019