有一个列为id
、name
和email
的customer
表,以及列为id
、street
、code
和customer_id
的address
表。
在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
它应该显示你的地址。不需要联接(但这些联接发生在服务器上)。
而且,您不需要在模型中指定表名。