Вложенные атрибуты, вычисления столбцов и оператор where

#ruby-on-rails #rails-activerecord

#ruby-on-rails #rails-activerecord

Вопрос:

Я не получаю желаемый результат, похоже, я неправильно вызываю свою переменную

Вот моя переменная контроллера для @vendor @vendors = User.inlcudes(line_items: [{ sale: :skiswap}]).where(sales: {skiswap_id: @skiswap.id})

затем имеем

       <% @vendors.each do |vendor| %>
      <tr class="group border-t border-gray-400 hover:bg-gray-100">
        <td class="p-3"><%= vendor.company %></td>
        <td class="p-3"><%= vendor.name  %></td>
        <td class="p-3"><%= vendor.email%></td>
        <td class="p-3"><%= number_to_phone(vendor.phone_number, area_code: true)%></td>
        <td class="p-3"><%= vendor.line_items.sum(:total_price)%></td>
      <% end %>
  

Строка
<td class="p-3"><%= vendor.line_items.sum(:total_price)%></td>
не используется исходный оператор where, поэтому мой итог неверен.

выходные строки сервера показывают это

   SQL (1.7ms)  SELECT "users"."id" AS t0_r0, "users"."email" AS t0_r1, "users"."encrypted_password" AS t0_r2, "users"."reset_password_token" AS t0_r3, "users"."reset_password_sent_at" AS t0_r4, "users"."remember_created_at" AS t0_r5, "users"."confirmation_token" AS t0_r6, "users"."confirmed_at" AS t0_r7, "users"."confirmation_sent_at" AS t0_r8, "users"."unconfirmed_email" AS t0_r9, "users"."first_name" AS t0_r10, "users"."last_name" AS t0_r11, "users"."time_zone" AS t0_r12, "users"."accepted_terms_at" AS t0_r13, "users"."accepted_privacy_at" AS t0_r14, "users"."announcements_read_at" AS t0_r15, "users"."admin" AS t0_r16, "users"."created_at" AS t0_r17, "users"."updated_at" AS t0_r18, "users"."invitation_token" AS t0_r19, "users"."invitation_created_at" AS t0_r20, "users"."invitation_sent_at" AS t0_r21, "users"."invitation_accepted_at" AS t0_r22, "users"."invitation_limit" AS t0_r23, "users"."invited_by_type" AS t0_r24, "users"."invited_by_id" AS t0_r25, "users"."invitations_count" AS t0_r26, "users"."company" AS t0_r27, "users"."phone_number" AS t0_r28, "line_items"."id" AS t1_r0, "line_items"."quantity" AS t1_r1, "line_items"."price" AS t1_r2, "line_items"."total_price" AS t1_r3, "line_items"."created_at" AS t1_r4, "line_items"."updated_at" AS t1_r5, "line_items"."consigner_type" AS t1_r6, "line_items"."consigner_amount" AS t1_r7, "line_items"."skiswap_take" AS t1_r8, "line_items"."sale_id" AS t1_r9, "line_items"."tag" AS t1_r10, "line_items"."inventory_id" AS t1_r11, "sales"."id" AS t2_r0, "sales"."amount" AS t2_r1, "sales"."total_amount" AS t2_r2, "sales"."tax" AS t2_r3, "sales"."vendor_payout" AS t2_r4, "sales"."public_payout" AS t2_r5, "sales"."comments" AS t2_r6, "sales"."skiswap_id" AS t2_r7, "sales"."created_at" AS t2_r8, "sales"."updated_at" AS t2_r9, "sales"."remaining_balance" AS t2_r10, "sales"."complete" AS t2_r11, "sales"."void" AS t2_r12, "skiswaps"."id" AS t3_r0, "skiswaps"."swap_name" AS t3_r1, "skiswaps"."user_id" AS t3_r2, "skiswaps"."description" AS t3_r3, "skiswaps"."vendor_precentage" AS t3_r4, "skiswaps"."website" AS t3_r5, "skiswaps"."contact_name" AS t3_r6, "skiswaps"."contact_email" AS t3_r7, "skiswaps"."contact_number" AS t3_r8, "skiswaps"."created_at" AS t3_r9, "skiswaps"."updated_at" AS t3_r10, "skiswaps"."event_address" AS t3_r11, "skiswaps"."state" AS t3_r12, "skiswaps"."city" AS t3_r13, "skiswaps"."zip" AS t3_r14, "skiswaps"."public_precentage" AS t3_r15, "skiswaps"."tax" AS t3_r16 FROM "users" LEFT OUTER JOIN "inventories" ON "inventories"."user_id" = "users"."id" LEFT OUTER JOIN "line_items" ON "line_items"."inventory_id" = "inventories"."id" LEFT OUTER JOIN "sales" ON "sales"."id" = "line_items"."sale_id" LEFT OUTER JOIN "skiswaps" ON "skiswaps"."id" = "sales"."skiswap_id" WHERE "sales"."skiswap_id" = $1  [["skiswap_id", 3]]
  ↳ app/views/pos_dashboard/index.html.erb:40
   (0.6ms)  SELECT SUM("line_items"."total_price") FROM "line_items" INNER JOIN "inventories" ON "line_items"."inventory_id" = "inventories"."id" WHERE "inventories"."user_id" = $1  [["user_id", 3]]
  ↳ app/views/pos_dashboard/index.html.erb:46
  CACHE  (0.0ms)  SELECT SUM("line_items"."total_price") FROM "line_items" INNER JOIN "inventories" ON "line_items"."inventory_id" = "inventories"."id" WHERE "inventories"."user_id" = $1  [["user_id", 1]]
  

Общая сумма является точной для пользователей total_price, но не для total_price в этом обмене…

Любая помощь была бы отличной

Ответ №1:

Я смог разобраться в этом, но если у вас есть лучшее предложение по форматированию, дайте мне знать. Кажется немного шумным с кавычками в выборе, но смог заставить его работать

 @vendor = User.select(:first_name, :last_name, :company, "sum(line_items.total_price) as total_sold", "count(line_items) as items_sold" ).joins(line_items: [{ sale: :skiswap}]).where(sales: {skiswap_id: @skiswap.id, complete: true, void: false }).group(:first_name, :last_name, :company)