如何将类名称ActiveRecord :: Result转换为ActiveRecord :: Relation

时间:2019-04-25 22:52:57

标签: ruby-on-rails activerecord

我在尝试以CSV格式下载SQL查询时遇到问题。

我了解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。因此,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 :(得分:0)

所以我终于弄清楚了。我不知道这是否是正确的方法,所以我使用了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上的bug报告中找到了答案。是的,现在我有了这个。但是原始查询与此不同。所以还是有问题