查询内部结果时,Rails上的语法错误原始SQL

时间:2019-05-24 16:51:06

标签: postgresql ruby-on-rails-4 rails-activerecord

如何在Rails上查询原始SQL?

所以我有此原始sql,需要在rails上运行,但给了我一个语法错误。我也避免了多余的括号,但是在第一个内部联接附近仍然出现语法错误。

这是我的代码:

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
                                        ")

0 个答案:

没有答案