我对ORM ActiveRecord 和关系数据库(例如在Rails中)有疑问:
我很困惑,连接(例如内部连接)不会发生在数据库层中,如果我是正确的,ActiveRecord会进行多次查询,然后自己加入记录......
这不是开销吗? Ruby正在做数据库的工作!
我错了吗?
任何建议表示赞赏。
我正在练习Rails,并想知道为什么数据库本身没有定义外键如下:
谢谢。
答案 0 :(得分:0)
默认情况下,Rails在加载关联时很懒惰。
e.g。
users = User.where(id: [1768, 1769, 1770])
将致电
SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1768, 1769, 1770)
现在,对于每一个,如果你要求user.company(例如),将再次为相应的公司查询数据库。
ActiveRecord还允许您在数据库端为查询进行连接,并使其在数据库端运行。 e.g。
User.joins(:company).where(companies: {id: 5})
将致电
SELECT `users`.* FROM `users` INNER JOIN `companies` ON `companies`.`id` = `users`.`company_id` WHERE `companies`.`id` = 5
您还可以在一个查询中加载一组记录,并在一个额外查询中加载所有关联:
users = User.where(id: [1768, 1769, 1770]).includes(:company)
将最终加载用户,然后加载公司
SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1768, 1769, 1770)
SELECT `companies`.* FROM `companies` WHERE `companies`.`id` IN (5, 1)
现在对于每个加载的用户,例如,询问users[0].company
将使用已加载的关联,并且不会命中数据库。
答案 1 :(得分:0)
正确答案:
一段时间后,我意识到可以为迁移中的foreign_key
数据库字段定义reference
,因此Active Record使用inner join
进行查询。
create_table :houses do |t|
...
t.references :house_type, foreign_key: true, index: true, null: false
...
end