我在尝试以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
放在任何地方。嗯。有什么主意吗?
答案 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报告中找到了答案。是的,现在我有了这个。但是原始查询与此不同。所以还是有问题