【问题标题】:Rails: How to show items only if creator is unique?Rails:如何仅在创建者唯一的情况下显示项目?
【发布时间】:2016-12-28 12:27:27
【问题描述】:

我有很多用户,每个用户都有多个项目。

现在,我只想为每个用户获取一项。

@projects = Project.all.where(user_id 是唯一的)

只有在没有提取来自同一用户的其他项目时才应该提取项目。

希望我的问题很清楚。我在 Rails 5 上。

编辑:

我在生产中使用 postgres。

【问题讨论】:

  • 如果我理解正确,您只想列出用户和他们的一个项目。没有项目的用户怎么办?提交任何项目是否可以接受?或者你想展示一个特定的项目?
  • 我不想列出用户。我正在做,@projects = Project.all.where(:status => "Published"),效果很好。但这也会由单个用户返回多个项目,我想对此进行限制。因此,我只想为每个用户列出一个已发布的项目。
  • 我明白了。感谢您的澄清。

标签: ruby-on-rails postgresql rails-activerecord


【解决方案1】:

有很多方法可以做到这一点。我会推荐以下代码作为起点:

projects_scope = Project.where(:status => "Published")
@projects = projects_scope.where(id: projects_scope.group(:user_id).maximum(:id).values)

它是这样工作的:

  1. 我们将两次使用已发布项目的范围,因此我们将其分配给一个变量以使其更具可读性。

  2. 我们按user_id 对项目进行分组,并使用maximum 选择具有最高ID 的项目(您可以使用minimum 或任何其他从组中选择一行的方法)。更详细:

    一个。 projects_scope.group(:user_id).maximum(:id) 返回一个将用户 ID 映射到项目 ID 的 Hash。例如{ 12 => 17, 14 => 3 } 表示用户12 我们选择项目17 和用户14 我们选择项目3。 湾。我们只对项目 ID 感兴趣,因此我们通过调用 Hash#values 来获取散列中的值。

  3. 知道ID后,我们查询数据库中对应的项目,并将结果分配给@projects

如果你想学习一些更高级的技术,我建议你看看this Stack Overflow question

【讨论】:

  • 我刚刚在开发(sqlite)和生产(postgres)中尝试了这个,它在两个环境中都按预期工作。真诚感谢您的解决方案和解释。只有一个问题,而不是按最大值或最小值来选择 id,是否可以随机选择一个 id?
  • 我很高兴,@HighOnRails。您可以查看我为通用 SQL 解决方案链接的其他 Stack Overflow 帖子,您可以通过 Active Record 使用这些解决方案。我不确定在您的情况下额外的复杂性是否值得。您可以采取的另一种完全不同的方法是project_scope.pluck(:user_id, :id)。它会返回一组对[user_id, project_id],并且您应该能够以任何您想要的方式为Ruby 中的每个user_id 选择一个project_id。 PS 在所有环境中使用同一个数据库更安全,所以我建议您将开发迁移到 PostgreSQL。
  • 是的,你是对的 Greg,我将立即将开发迁移到 Postgres。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多