2016-05-22 92 views
2

我需要SELECT FROM嵌套SELECT的幫助。ActiveRecord嵌套SELECT

如何以ActiveRecord方式重寫以下查詢並獲取Relation對象?

SELECT candidates.* 
FROM (SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates 
WHERE full_name = 'Anton Kolganov' 

回答

2

?子查詢將比直接查詢性能低得多。你可以使用select範圍得到了全名(它會以同樣的方式爲其它屬性訪問):

Candidate.select("candidates.*, (first_name || ' ' || last_name) AS full_name"). 
      where(first_name: 'Antonov', last_name: 'Kolganov') 

更新:如果你真的需要在FROM子查詢重寫上述查詢子句ActiveRecord的,你可以做到以下幾點:

Candidate.from("(SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates"). 
      where(full_name: 'Anton Kolganov') 

也就是說,在一般情況下,你可以把任何有效的SQL到ActiveRecord的範圍方法,包括selectfrom

+0

因爲我需要在來自[Hurray gem](https://github.com/rkotov93/hurray)的下一個鏈接_ordered_with_方法中使用full_name列,該方法以不同的方式表現自己。 – rkotov93

+0

你能舉一個包括'ordered_with'的例子嗎? – BoraMa

+0

嗯,我意識到,你的解決方案將爲我工作。謝謝! 但我仍然想知道是否可以使用ActiveRecord進行嵌套SELECT請求。 – rkotov93

0

有多種方法。您必須通過將查詢轉換爲sql或檢查結果來嘗試查看結果是否符合您的需求。

Candidates.where(other_query).where(SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates 
WHERE full_name = 'Anton Kolganov') 

你也可以使用加入或選擇一個地方。

如果你不希望訴諸普通的SQL爲什麼您連接,而不是選擇基於第一和最後一個名字,你可以使用寶石像ArelSqueel