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兼容。