레일즈 가이드를 참조했습니다. 5.0.1 기준입니다.링크
계속적으로 공부하면서 업데이트 하도록 하겠습니다ㅠㅠ 이제 개강이라
Association
주로 단 방향 형태이다. 종류를 살펴보자
-
belongs_to ( ~에 의존하고 있다하는 것을 표현 )
-
has_one ( 종속적이지만 하나만 가져야하는 경우! belongs_to와 반대 )
-
has_many ( 종속적인데 여러개를 가질 수 있는 경우! belongs_to와 반대 )
-
has_many :through ( M:N관계를 나타낼 때 사용, 중간테이블을 놓고 바인딩 시킴 )
-
has_one :through (거~의안씀)
-
has_and_belongs_to_many ( 중간 테이블의 존재를 없애버려 이렇게 사용하게 됨 )
-
self-join …기본적인 내용은 여기까지
Query
- 데이터베이스에서 객체 가져오기
- 단일 객체 가지고 오기
# find client = Client.find(10) # id가 10인 client를 찾아서 반환 client = Client.find([1, 10]) # id가 1이나 10인 client를 찾아서 반환 # take : 어떤 데이터를 가져올 지 정하지 않고 가지고 옴 client = Client.take(2) # 아무거나 두개 가지고 와 # first / last : 첫번째, 마지막. order시킨 후 가지고 올 수 있다. client = Client.first client = Client.last # find_by : 주어진 조건에 맞는 첫번째 레코드를 반환 Client.find_by first_name: 'Lifo' # first_name이 Lifo인 친구를 반환
- 여러개의 객체를 가지고 오기
# 만약 여러사람들에게 모두 동일한 행동을 할 때 이런식으로 하면 매우 느릴 것. 추후에는 메모리가 부족하게 될 것 User.all.each do |user| NewsMailer.weekly(user).deliver_now end # find_each : find_each는 각 레코드를 하나의 객체로 만들어 호출하게 됩니다. default는 1000개 입니다. User.find_each(batch_size: 5000) do |user| # 여기서 batch_size: 는 몇개를 하나의 객체로 만들어 호출할 지를 나타내게 됩니다. NewsMailer.weekly(user).deliver_now end User.find_each(start: 2000, finish: 10000) do |user| # 기본 키가 2000이상 10000이하인 사용자에게만 호출되게 됩니다. NewsMailer.weekly(user).deliver_now end # find_each를 사용하면 속도를 꽤 높일 수 있는 요인이 된다.
- 조건문
# where을 통해 넘겨받은 여러개의 조건에 맞는 Client를 배열로 반환합니다.
Client.where("orders_count = ? AND locked = ?", params[:orders], false)
# 이런식의 입력보다는
Client.where("orders_count = #{params[:orders]}")
# 이런식을 선호해주시길 바랍니다.
Client.where("orders_count = ?", params[:orders])
- 순서 만들기
> order
Client.order(created_at: :desc)
Client.order(created_at: :asc)
# OR
Client.order("created_at DESC")
Client.order("created_at ASC")
# 복수의 필드를 할 때는
Client.order(orders_count: :asc, created_at: :desc)
# OR
Client.order("orders_count ASC, created_at DESC")
- scoping
- none
- merge