2010-01-19 63 views
1

我是新來的rails並試圖理解它:has_many和:belongs_to功能。一對一加入導軌

如果我有3個表:CustomersPhysiciansAddresses

每個客戶和每個醫生都會有一個地址。所以這是一對一的關係。

CUSTOMER_ID和physician_id將因此匹配ADDRESS_ID

,如果我想用ID 3.客戶的地址,我會說

select * from customer, addresses 
where customer_id = 3 and customer.customer_id = addresses.address_id 

我怎麼會轉化爲Rails代碼呢?

我有3種型號CustomerPhysicianAddress

但我不知道爲的關係是什麼呢? 如何將上述查詢翻譯爲rails find函數?

Customer.find (:all, ......? 

回答

0

只是很快......您的意思是在您的SQL查詢「customer.address_id = addresses.address_id」對不對?

當你把

has_one :address 

到客戶模型和

belongs_to :customer 
在地址模型

,你做同樣的發現像往常一樣,但你可以參考它像:

@cust = Customer.find(params[:id]) 
street = @cust.address.street 
city = @cust.address.city 

等等...檢出http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html它說「它是一個belongs_to還是has_one關聯?」獲取更多信息。

+0

謝謝。所以在這種情況下,我不需要在Address模型中放置任何東西。客戶和醫師中只有一個會做? – patrick 2010-01-19 13:12:23

+0

對不起,我認爲你需要在地址模型中放入belongs_to:customer。 – Kevin 2010-01-19 13:55:17

+0

從技術上講,你不需要改變地址模型,但你應該這樣做,你應該可以參考 address.customer.first_name 這個例子中沒有很多實用工具,但它會在其他用途​​。 – Kevin 2010-01-20 01:48:28

3

我不會在表格之間共享PK。如果您有醫師(id = 1),客戶(id = 1)會怎麼樣。然後誰得到地址(id = 1)。這是我建議的模式

Address 
------- 
id 

Customer 
-------- 
id 
address_id 

Physician 
--------- 
id 
address_id 

然後,綁定到你的班級。

class Physician < ActiveRecord::base 
    belongs_to :address 
end 

class Customer < ActiveRecord::base 
    belongs_to :address 
end 

class Address < ActiveRecord::base 
    has_one :physician 
    has_one :customer 

    def customer_address? 
    !customer.nil? 
    end 

    def physician_address? 
    !physician.nil? 
    end 

end 

它可能稍微向後看,但看看FK關係。地址由醫生和客戶參考。而不是相反。

該文檔會說,你幾乎從不想要一個has_one關係。我使用它們,但只有當我用數據庫中的唯一ID加強它們時纔會使用它們。因此請確保您添加了如下所示的遷移。現在

self.up 
    add_index :customers, :address_id, :unique => true 
    add_index :physicians, :address_id, :unique => true 
end 

,你知道一個客戶僅會匹配到一個地址。

+0

customer_address是什麼?和physician_address?在你的地址模型類中嗎? – patrick 2010-01-19 13:22:47

+1

爲什麼你不使用多態關聯? – jonnii 2010-01-19 14:42:49