在Rails上查询ruby

时间:2019-04-24 23:29:17

标签: ruby-on-rails rails-activerecord

如何在Ruby on Rails上查询或在Ruby on Rails上翻译此查询?

SELECT
orders.item_total,
orders.total,
payments.created_at,
payments.updated_at
FROM
public.payments,
public.orders,
public.line_items,
public.variants
WHERE
payments.order_id = orders.id AND
orders.id = line_items.order_id AND

这正在我的Postgres上工作,但是我是RoR的新手,这给我查询该示例带来了困难。

到目前为止,这就是我所拥有的。

Order.joins(:payments,:line_items,:variants).where(payments:{order_id: [Order.ids]}, orders:{id:LineItem.orders_id}).distinct.pluck(:email, :id, "payments.created_at", "payments.updated_at")

在问一个问题之前,我有很多参考资料。

How to combine two conditions in a where clause?

Rails PG::UndefinedTable: ERROR: missing FROM-clause entry for table

Rails ActiveRecord: Pluck from multiple tables with same column name

ActiveRecord find and only return selected columns

https://guides.rubyonrails.org/v5.2/active_record_querying.html

通过所有链接,我生成了可用于测试的代码。

Spree::Order.joins(:payments,:line_items,:variants).where(id: [Spree::Payment.ids]).distinct.pluck(:email, :id)

但是当我尝试进行多个查询并从另一个表中选择一个特定的列名时,会给我一个错误。

更新

因此我使用ransack进行查询,我生成了此代码。

 @search = 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]
        )

        @payment_report = @search.result
                                        .includes(:payments, :line_items, :variants)
                                        .joins(:line_items, :payments, :variants).select('payments.response_code, orders.number, payments.number')

当我删除选择部分时,我没有错误,我需要获取该特定列。他们不在吗?

2 个答案:

答案 0 :(得分:1)

您只需在表之间进行联接,然后选择所需的列

Spree::Order.joins(:payments, :line_items).pluck("spree_orders.total, spree_orders.item_total, spree_payments.created_at, spree_payments.updated_at")

Spree::Order.joins(:payments, :line_items).select("spree_orders.total, spree_orders.item_total, spree_payments.created_at, spree_payments.updated_at")

等同于此查询

SELECT spree_orders.total,
spree_orders.item_total, 
spree_payments.created_at, 
spree_payments.updated_at 
FROM "spree_orders" 
LEFT OUTER JOIN "spree_payments" ON "spree_payments"."order_id" = "spree_orders"."id" 
LEFT OUTER JOIN "spree_line_items" ON "spree_line_items"."order_id" = "spree_orders"."id"

答案 1 :(得分:-1)

您可以使用select_all方法。此方法将返回ActiveRecord::Result类的实例,并在该对象上调用to_hash将返回一个哈希数组,每个哈希表示一个记录。

Order.connection.select_all("SELECT
orders.item_total,
orders.total,
payments.created_at,
payments.updated_at
FROM
public.payments,
public.orders,
public.line_items,
public.variants
WHERE
payments.order_id = orders.id AND
orders.id = line_items.order_id").to_hash