[Rails] 테이블의 총 값 계산 방법(aggregate 함수)

6103 단어 RubyRails

입문


이 보도는 달리기 엔지니어의 첫걸음이다AdventCalendar 2020 13일째 기사
Rails에서 표의 합계 값을 계산할 때 aggregate 함수는 편리하고 지능적이어서 보도를 해 보았다.

개발 환경


IDE:Cloud9
Ruby:2.6.3
Rails:5.2.4

실례를 보다


하고 싶은 일


나는 이런 시계를 만들어서 아래에 합계 값을 표시하고 싶다.

ER 그림



aggregate 함수를 사용하지 않을 때


controllers/carts.rb
def new
  @carts = Cart.where(user_id: current_user.id)
end
예를 들어 단백질(protain)의 합계 값을 표시하려면
views/carts/new.html.rb
<% sum = 0 %>
<% @carts.each do |cart| %>
<% sum += cart.food.protain %>
<% end %>
<%= sum %>
이렇게 되면 한 항목(상술한 경우 단백질)이 5줄이 필요해 외관상 똑똑하지 않다는 것을 보여준다.
views/carts/new.html.rb
<td>合計</td>
<td>
    <% sum = 0 %>
    <% @carts.each do |cart| %>
    <% sum += cart.food.calorie %>
    <% end %>
    <%= sum %>
</td>
<td>
    <% sum = 0 %>
    <% @carts.each do |cart| %>
    <% sum += cart.food.protain %>
    <% end %>
    <%= sum %>
</td>
<td>
  <% sum = 0 %>
    <% @carts.each do |cart| %>
    <% sum += cart.food.fat %>
    <% end %>
    <%= sum %>
</td>
<td>
  <% sum = 0 %>
    <% @carts.each do |cart| %>
    <% sum += cart.food.carbon %>
    <% end %>
    <%= sum %>
</td>
전체 시계를 표시하면 비교적 fat감이 있다.
따라서aggregate 함수를 사용하여 더욱 지능적으로 기술한다.

aggregate 함수를 사용하는 방법


컨트롤러는 아까와 같다.
controllers/carts.rb
def new
  @carts = Cart.where(user_id: current_user.id)
end
쇼핑 카트 모형에 다음과 같은 내용을 기술하였다.
model/cart.rb
def self.aggregate(column)
  self.all.map { |cart| cart.food[column] }.sum
end
views/carts/new.html.rb
<td>合計</td>
<td>
  <%= @carts.aggregate(:calorie) %>
</td>
<td>
  <%= @carts.aggregate(:protain) %>
</td>
<td>
  <%= @carts.aggregate(:fat) %>
</td>
<td>
  <%= @carts.aggregate(:carbon) %>
</td>
대단해.

좋은 웹페이지 즐겨찾기