Как преобразовать имя класса ActiveRecord :: Result в ActiveRecord :: Relation - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблема с моим запросом SQL, пытающимся загрузить его в формате CSV.

Я знаю о внедрении SQL, но пока это все, что у меня есть

Так что у меня есть этот запрос SQL.payment_report или результат публикуется в представлении.Я передаю запрос результата на ActiveRecord::Base.connection.exec_query() и выдаю мне нужный результат, проблема возникает при попытке загрузить его как CSV.

sql = "SELECT

        payments.response_code as transaction_id,
        orders."'number'" || '-' || payments."'number'" as invoice_number,
        orders.user_id,
        orders.email,
        variants.sku,
        line_items.price,
        orders.item_total,
        orders.total,
        payments.created_at,
        payments.updated_at

        FROM

        public.spree_payments,
        public.spree_orders,
        public.spree_line_items,
        public.spree_variants

        WHERE

        payments.order_id = orders.id AND
        orders.id = line_items.order_id AND
        line_items.variant_id = variants.id AND
        payments.state = 'completed' AND
        orders.completed_at BETWEEN SYMMETRIC
        '#{params[:q][:created_at_gt]}' AND '#{params[:q][:created_at_lt]}'
        "

@payment_report = ActiveRecord::Base.connection.exec_query(sql)

У меня есть этот кодскачать мой формат CSV.reports_controller.rb

respond_with(@payment_report) do |format|
          format.csv do
            send_data @payment_report.to_payment_report_csv,
                      filename: "Payment Report - #{params[:q][:created_at_gt].to_date} to #{params[:q][:created_at_lt].to_date}.csv"
          end

У меня есть этот код на моей модели payment.rb

def self.to_payment_report_csv
      col_names = %w[
        transaction_id
        number
        user_id
        email
        sku
        price
        item_total
        total
        created_at
        updated_at
      ]

      CSV.generate do |csv|
        csv << col_names
        all.each do |pay|
          row = []

          row << pay.transaction_id
          row << pay.number
          # row << pay.user.id
          # row << pay.email
          # row << pay.sku
          # row << pay.price
          # row << pay.item_total
          # row << pay.total
          row << pay.created_at
          row << pay.updated_at

          csv << row
        end
      end
    end

, но я попытался нажать кнопку и загрузить, я получаю эту ошибку.

undefined method to_payment_report_csv for #<ActiveRecord::Result:0x00007f3faf4c8ad8>

я пришел к выводу, что при проверке моей модели оплаты у нее есть ActiveRecord::Relation, поэтому я хотел преобразовать ее.

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

Orders:
   has_may: :Line_items, :Payments, Variants
LineItem:
   belongs_to: :Variant, :Order
Payment
   belongs_to: Order

Variant doesn't relate to anything

ОБНОВЛЕНИЕ по какой-то причине это работает.

Spree::Order.ransack(orders_gt: params[:q][:created_at_gt], orders_lt:
params[:q][:created_at_lt], payments_order_id_in: [Spree::Order.ids],
payments_state_eq: 'completed', orders_id_in: [Spree::LineItem.all.pluck(:order_id)]).result.includes(:payments, :line_items, :variants).joins(:line_items, :payments, :variants).to_json

но если ядобавил этот.line_items_variant_id_in: [Spree::Variant.ids] я получаю и ошибка

undefined method `to_i' for #<Array:0x00007fbd991fd7c8>

Я даже не положил to_i где-либо.хммм.есть идеи?

1 Ответ

0 голосов
/ 26 апреля 2019

Так что я наконец-то понял это. Я не знаю, если это правильный путь, поэтому у меня есть этот запрос с помощью Ransack.

@payment_report = Spree::Order.ransack(
          orders_gt: params[:q][:created_at_gt],
          orders_lt: params[:q][:created_at_lt],
          payments_order_id_in: [Spree::Order.ids],
          payments_state_eq: 'completed',
          orders_id_in: [Spree::LineItem.all.pluck(:order_id)],
          variants_id_in: [Spree::LineItem.ids]
        ).result.includes(:payments, :line_items, :variants).joins(:line_items, :payments, :variants)

очевидно, вы можете делать несколько запросов на Ransack, но этого не было в их документации. Я нашел ответ на сообщение об ошибке на их GitHub. да, так что пока у меня есть это. но необработанный запрос отличается от здесь. так что еще есть проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...