2015-04-17 27 views
2

底線 - 我想將兩個數據庫表加在一起,即不是彼此「屬於」,但有一個共同的字段。在軌道中加入無關表

在計算器上經過一番研究,我發現直接使用SQL,像這樣類似的問題的一些解決方案:

Address.joins('INNER JOIN phones on addresses.person_id = phones.person_id').select("addresses.*, phones.*").limit(1) 

當我使用上面的語句在我的軌道控制檯,但是,它執行下列SQL查詢:

Address Load (0.3ms) SELECT addresses.*, phones.* FROM `addresses` INNER JOIN phones on addresses.person_id = phones.person_id LIMIT 1 

,並返回以下數據(審查對隱私的原因):

=> #<ActiveRecord::Relation [#<Address id: 0001, created_at: "YYYY-MM-DD hh:mm:ss", updated_at: "YYYY-MM-DD hh:mm:ss", description: nil, line1: "123 Evergreen Terrace", line2: "", line3: "", city: "Springfield", state: "IL", country: "USA", zip: "11111", building_number: "001", person_id: 1, address_type: "Home", primary: false, show: nil, job_id: nil, room_number: "001", source: "HR", effective_date: "YYYY-MM-DD">]> 

手機表中沒有一個字段將其記錄到最終記錄中。

我必須讓這些不相關的表格「彼此屬於」才能使它們工作嗎?喜歡 -

class Address < ActiveRecord::Base 
    belongs_to :person 
end 

class Phone < ActiveRecord::Base 
    belongs_to :person 
    belongs_to :address 
end 

或者我可以做我想要的而不修改我的模型的關係嗎?

+0

你到底在做什麼?你想查找與手機屬於同一個人的所有地址嗎?或者你是否在尋找單身人士的所有地址和電話號碼? –

+0

我的目標是爲每個行中的一個人檢索包含地址和電話信息的表格。例如 知道如何做到這一點對於我想寫的另一個查詢也很有幫助,這涉及到從共享person_id的三個表中加入記錄。 – NewbieOnRails

+0

所以你想要多行,每行包含'person_id',地址屬性和電話屬性? –

回答

3

數據可能在查詢中不可見,但該記錄將響應查詢獲取的那些字段,如果電話記錄具有number屬性,則爲meaining,例如對.number執行呼叫將使用取號

address = Address.joins(....).select('*').first 
address.number # => this will print the phone number of the phone record. 
+0

謝謝!這正是我需要知道的。沒有意識到軌道控制檯只是隱藏了其餘的信息。 :) – NewbieOnRails

+2

@NewbieOnRails控制檯沒有隱藏任何東西。問題是「Address#inspect」只知道「地址」表中的列,它不知道查詢中的任何額外列。 「地址」實例OTOH確實知道查詢中的所有內容,因爲它使用'method_missing'基於查詢返回的內容創建訪問器方法。 –