2014-09-30 55 views
0

有一个customeridnameemail列,以及一个address表列idstreetcodecustomer_id加入标准化的表活动记录

在SQL我通过使用加入两者:

SELECT c.id, c.name, c.email, a.street, a.code FROM customer AS c, address AS a WHERE a.customer_id = c.id; 

在Rails我建模:

class Address < ActiveRecord::Base 
    self.table_name = 'address' 
end 
class Customer < ActiveRecord::Base 
    self.table_name = 'customer' 

    has_one :address 
end 

在我试图控制器:

  • Customer.joins(:address) =>SELECT customer.* FROM customer INNER JOIN address ON address.customer_id = customer.id
  • Customer.includes(:address) =>SELECT customer.* FROM customer; SELECT address.* FROM address WHERE address.customer_id IN (1, 2)

然而,两者都不会返回预期结果。

我如何获得与第一个SQL查询中定义的结果相同的结果,或者如何获得与第一个SQL查询中定义的结果相同的结果?

回答

1

这并不完全是这样,但我知道你来自哪里,在完成了大量数据库工作后学习了Rails。运行控制台来测试这些想法。首先,地址正确地“归属于”客户。客户“has_one”地址。这些在模型中定义。将模型看作数据库表。外键由您指定的这些关系定义。连接由关系解释。

因此,在控制台中创建一个地址。

> Address.create(:street => "123 Main") 

输出将显示新地址的ID。创建一个客户记录,并在address_id列中输入地址的ID。

Customer.create(:address_id=> [ new address id ]) 

查询客户:

> customer = Customer.find([id number]) 

然后,输入

> customer.address 

应该告诉你地址。不需要加入(但它们正在服务器上发生)。

而且,您不需要在模型中指定表名称。

+0

谢谢!你知道ActiveRecord是否使用延迟加载,并因此有时可能会隐藏属性? – bodokaiser 2015-01-18 09:57:58

+0

不客气!隐藏属性是什么意思?我相信懒惰加载发生在“渴望”加载。 – 2015-01-18 19:24:25