Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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—有效地选择一个id不在已知集合中的对象_Ruby On Rails - Fatal编程技术网

Ruby on rails rails—有效地选择一个id不在已知集合中的对象

Ruby on rails rails—有效地选择一个id不在已知集合中的对象,ruby-on-rails,Ruby On Rails,我正在建立一个由社区主持的群组博客。当用户访问mediate页面时,他会收到一篇尚未主持的随机帖子,并询问该帖子是否应该出现 因此,相关的对象是Post、User和Moderation。审核有一个post\u id和一个用户id。我想从集合post.all中找到一篇文章,其中不存在与该文章和当前用户相对应的适度对象 最有效的方法是什么?我可以获取该用户的所有审核,然后使用map获取该用户审核的所有帖子,然后作为(伪代码)Post.find查询帖子数据库(:conditions=>“id!=[已经

我正在建立一个由社区主持的群组博客。当用户访问
mediate
页面时,他会收到一篇尚未主持的随机帖子,并询问该帖子是否应该出现

因此,相关的对象是
Post
User
Moderation
审核
有一个
post\u id
和一个
用户id
。我想从集合
post.all
中找到一篇文章,其中不存在与该文章和当前用户相对应的
适度对象

最有效的方法是什么?我可以获取该用户的所有审核,然后使用
map
获取该用户审核的所有帖子,然后作为(伪代码)
Post.find查询帖子数据库(:conditions=>“id!=[已经审核的帖子列表])
,但我担心这可能会很慢?有没有更快的方法

另外,以某种方式缓存这篇文章会是一个好主意吗?可能通过获取所有未被缓和的文章,并将其保存在某个地方,然后在以后调用
mediate
方法时,首先检查该缓存并提供一篇文章(并从缓存中删除该文章),并且仅在缓存为空时再次检查是否有更多帖子


谢谢你的帮助!

我马上想到:

Post.all(:joins => 'LEFT OUTER JOIN moderations m ON p.id=m.post_id AND m.user_id != #{id}')

我是Ruby新手,我想我应该尝试编写一个程序来实现这一点,最终的结果在我看来非常糟糕,但我想我还是会在这里发布相关部分:

posts - moderations.select{|x| x.user_id == current_user}.collect{|x| x.post_id}

避免加载所有记录并在应用程序中选择/映射它。所有这些都应该在数据库中完成,这将只返回相关记录。请参阅ActiveRecord文档如何操作。使用
:joins
将使返回的帖子只读。如果不需要,也可以传递
:readonly=>false
。请参阅我认为这是任何ANSI-SQL rdbms兼容。