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
关系(虽然关系数量很多,我预计这可能是无法管理的)?
此时,没有办法在Rails中使用与数组的关系.但是,使用所选答案,您将遇到N + 1选择问题.假设您使用类中定义的"tags"方法获取帖子,然后在每个帖子上为其添加标签.对于您调用标签的每个帖子,您将产生另一个数据库命中.
希望这将在未来发生变化,我们可以摆脱连接表(特别是考虑到Postgres 9.4将包括对Arrays中的外键的支持).
你真正需要做的就是
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 个相关表只是为了获取名称)。我不一定非要使用活动记录来对数据库做一些很酷的事情。