2010-01-19 60 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