Ruby on rails Rails 4:按顺序使用PostgreSQL函数会导致查询错误,因为未联接includes表
我发现Rails 4活动记录查询存在一个奇怪的问题,如果我在顺序中使用PostgreSQL函数,则includes表不会联接。如果删除PostgreSQL函数,同样的查询也可以正常工作 这个很好用Ruby on rails Rails 4:按顺序使用PostgreSQL函数会导致查询错误,因为未联接includes表,ruby-on-rails,postgresql,ruby-on-rails-4,activerecord,Ruby On Rails,Postgresql,Ruby On Rails 4,Activerecord,我发现Rails 4活动记录查询存在一个奇怪的问题,如果我在顺序中使用PostgreSQL函数,则includes表不会联接。如果删除PostgreSQL函数,同样的查询也可以正常工作 这个很好用 Widget.includes(:sprocket).order("sprockets.name").all 此操作失败,因为未加入包含关系 Widget.includes(:sprocket).order("lower(sprockets.name)").all 请注意,唯一不同的是下部(spr
Widget.includes(:sprocket).order("sprockets.name").all
此操作失败,因为未加入包含关系
Widget.includes(:sprocket).order("lower(sprockets.name)").all
请注意,唯一不同的是下部(sprockets.name)
我知道我可以添加这样的参考资料
Widget.includes(:sprocket).references(:sprockets).order("lower(sprockets.name)").all
这会起作用,但这项计划的目的是什么
我发现用eager_load替换include同样有效,但是,include的目的是什么呢
Widget.eager_load(:sprocket).order("lower(sprockets.name)").all
在Rails3中,只需使用includes就可以了。我想我有很多代码要修改,但只是希望有一个更简单的修复
谢谢假设您需要获取前五篇文章的用户名。您可以在下面快速编写查询并享受周末
posts = Post.limit(5)
posts.each do |post|
puts post.user.name
end
好。但让我们看看这些问题
Post Load (0.5ms) SELECT `posts`.* FROM `posts` LIMIT 5
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
1查询
获取所有帖子
和1查询
获取每个帖子的用户
,总共产生6个查询
。请查看下面的解决方案,该解决方案可以做同样的事情,只需在2个查询中执行即可:
posts = Post.includes(:user).limit(5)
posts.each do |post|
puts post.user.name
end
#####
Post Load (0.3ms) SELECT `posts`.* FROM `posts` LIMIT 5
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2)
有一点不同。将includes(:posts)
添加到您的查询中,并解决问题。快,好,容易
但是,不要只是在查询中添加includes
,而没有正确理解它。将包含
与联接一起使用
可能会导致交叉联接,具体取决于具体情况,在大多数情况下,您不需要这样做
如果要向包含的模型添加条件,则必须明确引用这些条件。例如:
User.includes(:posts).where('posts.name = ?', 'example')
将抛出一个错误,但这将起作用:
User.includes(:posts).where('posts.name = ?', 'example').references(:posts)
请注意,includes
与关联名称一起使用
,而引用
需要实际表名
这是一篇很棒的文章。谢谢我很高兴听到这个消息