Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4:按顺序使用PostgreSQL函数会导致查询错误,因为未联接includes表_Ruby On Rails_Postgresql_Ruby On Rails 4_Activerecord - Fatal编程技术网

Ruby on rails Rails 4:按顺序使用PostgreSQL函数会导致查询错误,因为未联接includes表

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

我发现Rails 4活动记录查询存在一个奇怪的问题,如果我在顺序中使用PostgreSQL函数,则includes表不会联接。如果删除PostgreSQL函数,同样的查询也可以正常工作

这个很好用

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
关联名称一起使用
,而
引用
需要
实际表名

这是一篇很棒的文章。谢谢我很高兴听到这个消息