Запрос на ruby ​​on Rails - PullRequest
       15

Запрос на ruby ​​on Rails

1 голос
/ 25 апреля 2019

Как вы запрашиваете на 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")

У меня много ссылок, прежде чем задать вопрос, вот ссылки.

Как объединить два условия в предложении where?

Rails PG :: UndefinedTable: ОШИБКА: отсутствует запись предложения FROM для таблицы

Rails ActiveRecord: извлечение из нескольких таблиц с одинаковым именем столбца

ActiveRecord находит и возвращает только выбранные столбцы

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)

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

UPDATE

, поэтому я использую 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 ]

1 голос
/ 25 апреля 2019

Вам просто нужно объединить таблицы и затем выбрать нужные столбцы

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"
0 голосов
/ 25 апреля 2019

Вы можете использовать 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
...