【发布时间】: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
我的迁移如下所示:
create table :posts do |t|
t.string :tags, array: true, default: []
end
如何获取存储在所有帖子标签下的所有唯一标签的数组?
【问题讨论】:
标签: ruby-on-rails ruby postgresql ruby-on-rails-4 rails-postgresql
您可以在数据库中使用:
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 似乎有点像一种骇人听闻的方式。
Post 类方法中。我认为您不需要 flatten 调用,您需要使用 select_rows 调用它,因为即使结果集中的每一行只有一个条目,它也会返回 AoA。
我相信你也可以这样做:
Post.pluck(:tags).flatten.uniq
如果您有大量帖子,这可能会对性能造成相当大的影响...
【讨论】:
Post.pluck(:tags).uniq 会返回所有唯一的标签集。这是使用数组列而不是多对多标签关联表的缺点。
我一发布,就找到了一个可行的解决方案,尽管可能有更优雅的方法来解决这个问题:
Post.select(:tags).map(&:tags).flatten.uniq
我被 .map 解决的对象数组甩了。
【讨论】: