Синтаксическая ошибка raw sql на рельсах при запросе внутренних результатов - PullRequest
0 голосов
/ 24 мая 2019

как вы запрашиваете сырой SQL на рельсах?

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

вот мой код:

Spree::CorporateAccount.joins(" (((((
                ( inner join spree_memberships on spree_corporate_accounts.id = spree_memberships.corporate_account_id)
                inner join spree_users on spree_memberships.user_id = spree_users.id) 
                left join  spree_variant_price_sets on spree_corporate_accounts.variant_price_set_id = spree_variant_price_sets.id)
                left join  spree_addresses on spree_corporate_accounts.bill_address_id = spree_addresses.id)
                left join  spree_states on spree_addresses.state_id = spree_states.id)
                left join  spree_countries on spree_addresses.country_id = spree_countries.id)
                left join  spree_partner_accounts on spree_corporate_accounts.id = spree_partner_accounts.partnerable_id 
                ").where(" spree_memberships.deleted_at IS null 
                  AND (spree_partner_accounts.partnerable_type = 'Spree::CorporateAccount' OR spree_partner_accounts.partnerable_type IS NULL)
                  AND admin = true 
                  ")

но на sql это прекрасно.

SELECT 
spree_corporate_accounts.id,
spree_corporate_accounts.company_name,
spree_memberships.ADMIN,
spree_users.email,
spree_users.doctor AS name,
spree_partner_accounts.account_key,
CASE spree_corporate_accounts.billing_type when 1 THEN 'Postbill' WHEN 2 THEN 'Creditcard' ELSE 'Individual'END,
spree_variant_price_sets.name AS priceset,
spree_addresses.address1,
spree_addresses.address2,
spree_addresses.city,
spree_addresses.zipcode,
spree_states.name AS state,
spree_countries.name AS country,
spree_addresses.phone,
spree_users.created_at 
from (((((( spree_corporate_accounts inner join spree_memberships on spree_corporate_accounts.id = spree_memberships.corporate_account_id)
inner join spree_users on spree_memberships.user_id = spree_users.id) 
left join  spree_variant_price_sets on spree_corporate_accounts.variant_price_set_id = spree_variant_price_sets.id)
left join  spree_addresses on spree_corporate_accounts.bill_address_id = spree_addresses.id)
left join  spree_states on spree_addresses.state_id = spree_states.id)
left join  spree_countries on spree_addresses.country_id = spree_countries.id)
left join  spree_partner_accounts on spree_corporate_accounts.id = spree_partner_accounts.partnerable_id 
where spree_memberships.deleted_at IS null 
and  (spree_partner_accounts.partnerable_type = 'Spree::CorporateAccount' OR spree_partner_accounts.partnerable_type IS NULL )
AND admin = true 

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

Spree::CorporateAccount.joins("inner join spree_memberships on spree_corporate_accounts.id = spree_memberships.corporate_account_id")
                                       .joins("inner join spree_users on spree_memberships.user_id = spree_users.id")
                                       .joins("left join  spree_variant_price_sets on spree_corporate_accounts.variant_price_set_id = spree_variant_price_sets.id")
                                       .joins("left join  spree_addresses on spree_corporate_accounts.bill_address_id = spree_addresses.id")
                                       .joins("left join  spree_states on spree_addresses.state_id = spree_states.id")
                                       .joins("left join  spree_countries on spree_addresses.country_id = spree_countries.id")
                                       .joins("left join  spree_partner_accounts on spree_corporate_accounts.id = spree_partner_accounts.partnerable_id ")
                                       .where("spree_memberships.deleted_at IS null
                                        AND spree_partner_accounts.partnerable_type = 'Spree::CorporateAccount' OR spree_partner_accounts.partnerable_type IS NULL
                                        AND admin = true
                                        ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...