2017-01-09 23 views
2

我有一個屬於組織模型的Entry模型...兩次。如何使用pluck從與class_name相關的模型中獲取屬性

class Entry < ActiveRecord::Base 
    belongs_to :organization 
    belongs_to :temp_organization, class_name: "Organization" 
end 

我試圖寫一個AR查詢使用pluck拉過相關的組織和temp_organization名。

Entry 
    .includes(:organization, :temp_organization) 
    .pluck('organizations.name', 'temp_organizations.name') 

這崩潰,並顯示以下錯誤:

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: missing FROM-clause entry for table "temp_organizations" 

這是合理的 - 沒有temp_organizations表,因爲該關聯是通過正規organizations表管理。

如何獲得pluck以提取temp_organization名稱?

回答

1

所以有多個連接到同一個表,AR做了一些魔術和重命名錶,這就是爲什麼你不能拉了正確的表名。

您可以檢查表名是通過查看生成的SQL什麼:

Entry.includes(:organization, :temp_organization).to_sql 

你應該得到的東西,如:

...INNER JOIN \"organizations\" \"entries_temp_organizations\" ON \"entries_temp_organizations\"... 

我懷疑表名是「entries_temp_organizations」(遵循連接表的字母順序的AR規則)。一個正確的表名稱採摘應該做的伎倆。

+0

當我執行'Entry .... to_sql'時,它會觸發三個數據庫查詢,''SELECT \「entries \」。* FROM \「entries \」「','SELECT」organizations。* FROM「organizations」WHERE 「組織」,「id」= 1'和'SELECT「組織」*「從」組織「在哪裏」組織「。」id「IN(52 ...'。但是,如果我將'includes'更改爲'join ',我得到了一個單一的SELECT語句,看起來更像你期望的那樣,它顯示錶名爲'temp_organizations_entries',但是當我使用包含或連接時它仍然會產生同樣的錯誤。 – CodeSmith

+0

我必須在我的代碼中有錯誤。當我使用'temp_organizations_entries.name'時,一切正在運行。謝謝。 – CodeSmith

1

使用try,

Entry 
    .includes(:organization, :temp_organization) 
    .references(:organization, :temp_organization) 
    .pluck('organizations.name', 'entries_temp_organizations.name') 
+0

沒有運氣,我仍然得到相同的錯誤(除了表名更改爲'temp_organizations_entries')。 – CodeSmith

+0

@CodeSmith Entry模型表的名字是什麼? –

+0

@CodeSmith此外,「組織」模型的表名是什麼? –

相關問題