Postgres dotaz funguje na konzole, ale používat to jako prostor v pohledu vykreslí chyby syntaxe

0

Otázka

Jsem pomocí dotazu načíst SubscriptionCart s nejstarší authorized_at datum od Subscription.

Od Subscription has_many SubscriptionCartJsem filtr vozíky se stejným plan_id jako Předplatné plan_id. Já také použít WHERE prohlášení pro Subscription a SubscriptionCart stavy stejně.

Dotaz, zdá se, že funguje dobře na konzoli, ale když jsem to dal do Předplatného působnosti a snaží se ho využít ve svých postojích jsem si:

PG::SyntaxError: ERROR:  syntax error at or near "WHERE"
LINE 6: ...ubscriptions.id, subscription_carts.authorized_at WHERE "sub...

Co se děje?

dotaz:

select distinct on (s.id) s.id, sc.authorized_at as cart_authorized_at, s.*
from subscriptions s
join subscription_carts sc on sc.subscription_id = s.id and sc.plan_id = s.plan_id
where sc.status = 'processed'
and s.status IN ('authorized','in_trial', 'paused')
order by s.id, sc.authorized_at

rozsah:

  scope :with_current_price_version, -> {
    select("
      DISTINCT ON (subscriptions.id) subscriptions.id,
      subscription_carts.authorized_at as version_cart_authorized_at,
      subscriptions.*
    ")
    .joins("
      INNER JOIN subscription_carts
      ON subscription_carts.subscription_id = subscriptions.id                 
      AND subscription_carts.plan_id = subscriptions.plan_id   
      WHERE subscription_carts.status = 'processed'
      AND subscriptions.status IN ('authorized','in_trial', 'paused')
      ORDER BY subscriptions.id, subscription_carts.authorized_at
    ")
  }

EDIT: Stěhování, KDE A & ORDER BY klauzule mimo .připojit opraven problém.

aktualizováno působnosti vypadá:

  scope :with_current_price_version, -> {
    select("DISTINCT ON (subscriptions.id) subscriptions.id,
           subscription_carts.authorized_at as version_cart_authorized_at, subscriptions.*")
      .joins("INNER JOIN subscription_carts on subscription_carts.subscription_id = subscriptions.id
             AND subscription_carts.plan_id = subscriptions.plan_id")
      .where("subscription_carts.status = 'processed'
             AND subscriptions.status IN ('authorized','in_trial', 'paused')")
      .order("subscriptions.id, subscription_carts.authorized_at")
  }
1

Nejlepší odpověď

0
class Subscription < ApplicationRecord
  def self.with_latest_subscription_cart
    s = arel_table
    sc = SubscriptionCart.arel_table.alias('sc')
    select(
      'DISTINCT ON(subscriptions.id)',
      :id, # not sure why you want to select this explicitly 
      s[Arel.star],
      sc[:authorized_at]
    )
    .joins(
      s.join(sc).on(
        sc[:subscription_id].eq(s[:id]).and(
          sc[:plan_id].eq(s[:plan_id])
        )
      ).join_sources
    )
    .where(
      status: 'processed',
      sc: {
        status: ['authorized','in_trial', 'paused']
      }
    )
    .order(:id, sc[:authorized_at])
  end
end

Bylo by to mnohem jednodušší, ale pokud jste se přestěhovali subscription_carts.plan_id = subscriptions.plan_id do WHERE doložka místo, takže můžete jen použít joins(:subscription_carts).

2021-11-23 22:24:26

Děkuji Max. Existuje nějaký způsob, jak na objednávku do authorized_at datum místo na základě předplatného.id? Dostávám chyby související s výraznou a aby tím, že výrazy jsou různé.
pinkfloyd90

Já bych asi použít boční připojit - viz moje odpověď na vaši druhou otázku.
max

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................