将postgres_ext(或Rails 4)数组与关联组合在一起

Nuc*_*uck 6 postgresql ruby-on-rails-4 rails-activerecord postgres-ext

我正在尝试使用每个项目上的类型字段来开发标签(在tags表格中)和项目(在items表格中)之间的多对多关系integer[].

我知道Rails 4(和通过postgres_ext的Rails 3)通过:array => true参数支持Postgres的数组功能,但我无法弄清楚如何将它们与Active Record关联相结合.

是否has_many有这个选项?这有宝石吗?我应该放弃并且只是建立一种has_many :through关系(虽然关系数量很多,我预计这可能是无法管理的)?

sat*_*sat 5

此时,没有办法在Rails中使用与数组的关系.但是,使用所选答案,您将遇到N + 1选择问题.假设您使用类中定义的"tags"方法获取帖子,然后在每个帖子上为其添加标签.对于您调用标签的每个帖子,您将产生另一个数据库命中.

希望这将在未来发生变化,我们可以摆脱连接表(特别是考虑到Postgres 9.4将包括对Arrays中的外键的支持).


mhe*_*xon 4

你真正需要做的就是

def tags
  Tag.where(id: tag_ids)
end

def add_tag(tag)
  self.tag_ids += [tag.id] unless tag_ids.include?(tag.id)
end
Run Code Online (Sandbox Code Playgroud)

至少我现在就是这么做的。我使用哈希值(hstore)以及权限做了一些非常酷的事情。处理标签的一种方法是通过创建 has_many 并将标签保留在字符串数组列中,因为它们是为了方便和性能而添加的(不必查询 2 个相关表只是为了获取名称)。我不一定非要使用活动记录来对数据库做一些很酷的事情。