【问题标题】:Using postgres arrays in Rails 4, how do I return an array of all the unique items in the array?在 Rails 4 中使用 postgres 数组,如何返回数组中所有唯一项的数组?
【发布时间】:2013-08-27 19:46:14
【问题描述】:

我的迁移如下所示:

create table :posts do |t|
    t.string :tags, array: true, default: []
end

如何获取存储在所有帖子标签下的所有唯一标签的数组?

【问题讨论】:

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


    【解决方案1】:

    您可以在数据库中使用:

    select distinct unnest(tags) from posts
    

    所以如果你只想要字符串,那么你可以直接进入数据库:

    tags = Post.connection.select_rows('select distinct unnest(tags) from posts').flatten
    

    如果tags 数组或大量数组之间有很多重叠,那么这应该比将所有数组从数据库中拉出并在 Ruby 中进行数据整理更快。

    【讨论】:

    • 我会说这个答案比我自己的要好。我不确定在数据库中查询数组值的方法,但我很确定它存在。我可能会建议尝试通过执行Post.select('DISTINCT unnest(tags) AS uniq_tags').pluck(:uniq_tags).flatten 之类的操作来稍微改变调用方式——select_rows 似乎有点像一种骇人听闻的方式。
    • @nzifnab:如果你愿意的话,你可以把所有的 AR 东西都包裹在它周围,但我对 SQL 和对 Ruby 一样熟悉,我发现通常的“除了 Ruby”的态度有点令人费解;无论如何,您大概会将其包装在 Post 类方法中。我认为您不需要 flatten 调用,您需要使用 select_rows 调用它,因为即使结果集中的每一行只有一个条目,它也会返回 AoA。
    • 好点,不需要展平。无论哪种方式,你都会得到相同的结果。我想这是一个偏好问题。
    【解决方案2】:

    我相信你也可以这样做:

    Post.pluck(:tags).flatten.uniq
    

    如果您有大量帖子,这可能会对性能造成相当大的影响...

    【讨论】:

    • 真的没有办法解决这个问题,因为Post.pluck(:tags).uniq 会返回所有唯一的标签集。这是使用数组列而不是多对多标签关联表的缺点。
    • @tadman:有办法绕过它,PostgreSQL 有一组相当丰富的数组operators and functions。
    【解决方案3】:

    我一发布,就找到了一个可行的解决方案,尽管可能有更优雅的方法来解决这个问题:

    Post.select(:tags).map(&:tags).flatten.uniq
    

    我被 .map 解决的对象数组甩了。

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 2021-10-04
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多