将规范化表与活动记录连接起来



有一个列为idnameemailcustomer表,以及列为idstreetcodecustomer_idaddress表。

在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查询中定义的结果相同的结果,或者正确的方法是什么

虽然不是这样,但我理解你的来龙去脉,因为我在做了大量DB工作后学习了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

它应该显示你的地址。不需要联接(但这些联接发生在服务器上)。

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

最新更新