2015-06-27 87 views
0

我有3種型號軌連接兩個表之間的查詢與同類領域

class Company < ActiveRecord::Base 
    has_many : CompanyAccount 
    has_many : CompanyContact 
end 

class CompanyContact < ActiveRecord::Base 
    belongs_to : Company 
end 

class CompanyAccount < ActiveRecord::Base 
    belongs_to : Company 
end 

同時作爲CompanyAccount和CompanyContact模型屬於公司的模式,他們有一個類似的「COMPANY_ID」字段。我已經檢索通過查詢一些賬戶:

@CompanyAccounts = CompanyAccount.where.not(balance:nil) 

現在,用我試圖獲取所有從我CompanyContacts表屬於與我上面查詢的CompanyAccounts相關聯的同一家公司的數據共同的company_id場(換句話說,我試圖找到具有相同company_id的行)。我使用「連接」做了幾次嘗試,但到目前爲止一切都失敗了。任何人都可以給我什麼在這種情況下適當的語法?謝謝。

回答

0

首先,請注意正確的Ruby命名約定。 Ruby類和模塊應該使用CamelCase,而符號,方法和變量都應該使用snake_case。鑑於此,我會重新寫你的模型如下

class Company < ActiveRecord::Base 
    has_many: company_accounts 
    has_many: company_contacts 
end 

class CompanyContact < ActiveRecord::Base 
    belongs_to: company 
end 

class CompanyAccount < ActiveRecord::Base 
    belongs_to: company 
end 

現在,你的問題。我會使用includes來加載關聯公司及其關聯的聯繫人。例如

@company_accounts = CompanyAccount.includes(company: :company_contacts).where.not(balance: nil) 

這將完成對各公司賬戶的平衡,它會加載它的關聯公司和公司的相關聯繫人到內存中,這樣就可以訪問它

@company_accounts.each do |account| 
    # access to the company 
    account.company 

    # access to the company's contacts 
    account.company.contacts 
end 

希望這幫助。

+0

謝謝這是有益的,並感謝命名約定評論。在第二種情況下(#訪問公司的聯繫人),我沒有檢索對象,而是我無法直接調用該屬性的集合。構建數組以檢索account.company.contacts的屬性(例如名稱)是最佳選擇嗎? – Bastien

+0

所以你想檢索一個聯繫人姓名數組?你可以做'account.company.contacts.map(&:name)'。 –