ActiveRecord从类

时间:2015-12-04 13:57:22

标签: mysql sql ruby-on-rails ruby activerecord

我想使用ActiveRecord查询接口编写SQL查询,但我无法猜出ActiveRecord将为该表提供什么别名。这是SQL查询:

SELECT P2.NUM_DOCUMENTO FROM
SCHEMA1.PESSOA_CPBS PC
INNER JOIN SCHEMA2.PESSOA P ON(PC.PESSOA = P.ID_PESSOA)
INNER JOIN SCHEMA2.REPRESENTANTE_LEGAL R ON(R.PESSOA = P.ID_PESSOA)
INNER JOIN SCHEMA2.PESSOA P2 ON(R.REPRESENTANTE_LEGAL = P2.ID_PESSOA)
WHERE PC.INSCRICAO = ?

这是用Ruby编写的相同查询(ActiveRecord):

Pessoa::PessoaCPBS.joins(pessoa: [representantes: :representante])
                  .select('representante.num_documento')
                  .where('inscricao = :inscricao', inscricao: ?)

ActiveRecord生成以下SQL:

SELECT 
  representante.num_documento 
FROM 
  "SCHEMA1"."PESSOA_CPBS" 
  INNER JOIN "SCHEMA2"."PESSOA" ON "SCHEMA2"."PESSOA"."ID_PESSOA" = "SCHEMA1"."PESSOA_CPBS"."PESSOA" 
  INNER JOIN "SCHEMA2"."REPRESENTANTE_LEGAL" ON "SCHEMA2"."REPRESENTANTE_LEGAL"."PESSOA" = "SCHEMA2"."PESSOA"."ID_PESSOA" 
  INNER JOIN "SCHEMA2"."PESSOA" "REPRESENTANTE_GRPFOR_REPRESENT" ON "REPRESENTANTE_GRPFOR_REPRESENT"."ID_PESSOA" = "SCHEMA2"."REPRESENTANTE_LEGAL"."REPRESENTANTE_LEGAL" 
WHERE (inscricao = ?)

我收到以下错误:

ActiveRecord::JDBCError: java.sql.SQLSyntaxErrorException: ORA-00904: "REPRESENTANTE"."NUM_DOCUMENTO": invalid identifier

这是我希望ActiveRecord吐出的查询:

SELECT 
  "REPRESENTANTE_GRPFOR_REPRESENT"."NUM_DOCUMENTO"
FROM 
  "SCHEMA1"."PESSOA_CPBS" 
  INNER JOIN "SCHEMA2"."PESSOA" ON "SCHEMA2"."PESSOA"."ID_PESSOA" = "SCHEMA1"."PESSOA_CPBS"."PESSOA" 
  INNER JOIN "SCHEMA2"."REPRESENTANTE_LEGAL" ON "SCHEMA2"."REPRESENTANTE_LEGAL"."PESSOA" = "SCHEMA2"."PESSOA"."ID_PESSOA" 
  INNER JOIN "SCHEMA2"."PESSOA" "REPRESENTANTE_GRPFOR_REPRESENT" ON "REPRESENTANTE_GRPFOR_REPRESENT"."ID_PESSOA" = "SCHEMA2"."REPRESENTANTE_LEGAL"."REPRESENTANTE_LEGAL" 
WHERE (inscricao = ?)

我怎么能猜到表格的别名????

1 个答案:

答案 0 :(得分:1)

您可以更改为:

Pessoa::PessoaCPBS.select('representate_grpfor_represent.num_documento')
   .joins(pessoa: [representantes: :representante])
   .where('inscricao = ?', "put-your-search-string-here")

joins表格中添加select别名即可:

Pessoa::PessoaCPBS.select('P2.num_documento')
   .joins("AS PC INNER JOIN SCHEMA2.PESSOA P ON(PC.PESSOA = P.ID_PESSOA) INNER JOIN SCHEMA2.REPRESENTANTE_LEGAL R ON(R.PESSOA = P.ID_PESSOA) INNER JOIN SCHEMA2.PESSOA P2 ON (R.REPRESENTANTE_LEGAL = P2.ID_PESSOA)")
   .where('PC.inscricao = ?', "put-your-search-string-here")

您可以修复必要的内容,因为您的第一个查询和上一个查询不同,尤其是在上一个INNER JOIN中。

我希望这对你有所帮助。