使用活动记录加入规范化表

时间:2014-09-30 14:14:35

标签: ruby-on-rails rails-activerecord

有一个customer表格,其中列idnameemail以及列address id表,{ {1}},streetcode

在SQL中,我使用:

加入两者
customer_id

在Rails中我建模了:

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

在我试过的控制器中:

  • class Address < ActiveRecord::Base self.table_name = 'address' end class Customer < ActiveRecord::Base self.table_name = 'customer' has_one :address end =&gt; Customer.joins(:address)
  • SELECT customer.* FROM customer INNER JOIN address ON address.customer_id = customer.id =&gt; Customer.includes(:address)

但两者都不会返回预期的结果。

如何获得与第一个SQL查询中定义的结果相同的结果或者执行此操作的正确方法?

1 个答案:

答案 0 :(得分: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

它应该显示地址。没有必要加入(但它们正在服务器上发生)。

而且,您无需在模型中指定表名。