用户has_many帖子。获取至少有1个帖子的所有用户

时间:2014-06-13 21:59:57

标签: ruby ruby-on-rails-4

用户有很多帖子。

在视图中,我想获得至少包含1个帖子的所有用户的按字母顺序排列的列表。这是我目前的做法。有没有办法让这一行/使用更好的Rails ActiveRecord约定?

@users.order("name ASC").each do |user|
  if user.posts > 0
    ...
  end
end

3 个答案:

答案 0 :(得分:3)

您当前的解决方案并不错(这是一个查询)但可以改进。

您可以使用ActiveRecord的内置计数器缓存功能来存储父级上的关联对象的数量(在这种情况下,是与用户关联的帖子数)。然后你可以制作这样的查询:

User.where('posts_count > 0').order('name ASC')

以下是:counter_cachetaken 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中所述。计数器缓存也不是一个糟糕的解决方案。