用户有很多帖子。
在视图中,我想获得至少包含1个帖子的所有用户的按字母顺序排列的列表。这是我目前的做法。有没有办法让这一行/使用更好的Rails ActiveRecord约定?
@users.order("name ASC").each do |user|
if user.posts > 0
...
end
end
答案 0 :(得分:3)
您当前的解决方案并不错(这是一个查询)但可以改进。
您可以使用ActiveRecord的内置计数器缓存功能来存储父级上的关联对象的数量(在这种情况下,是与用户关联的帖子数)。然后你可以制作这样的查询:
User.where('posts_count > 0').order('name ASC')
以下是:counter_cache
(taken from here)上的文档:
:counter_cache
通过使用increment_counter和decrement_counter来缓存关联类上的所属对象的数量。计数器缓存在创建此类的对象时递增,在销毁时递减。这要求在关联类(例如Post类)上使用名为#{table_name} _count的列(例如属于Comment类的comments_count) - 即在关联时创建#{table_name} _count的迁移class(这样Post.comments_count将返回缓存的计数,请参阅下面的注释)。您还可以通过为此选项提供列名而不是true / false值来指定自定义计数器缓存列(例如,counter_cache :: my_custom_counter。)注意:指定计数器缓存会将其添加到该模型的只读属性列表中attr_readonly。
答案 1 :(得分:0)
我们可以使用此功能获取至少有一个帖子的所有用户ID。
Post.uniq.pluck(:user_id);
然后我们可以按如下方式获取所有用户。
User.order(:name).find(Post.uniq.pluck(:user_id));
答案 2 :(得分:0)
User.joins(:posts).order('users.name asc')
将执行内部联接,如文档here中所述。计数器缓存也不是一个糟糕的解决方案。