6

我正在尝试使用每个项目上的类型字段在标签(tags表中)和项目(表中)之间建立多对多关系。itemsinteger[]

我知道 Rails 4(和通过 postgres_ext 的 Rails 3)通过:array => true参数支持 Postgres 的数组功能,但我不知道如何将它们与 Active Record 关联结合起来。

has_many有这个选项吗?有这个宝石吗?我应该放弃并建立一种has_many :through关系(尽管我期望的关系数量可能无法管理)?

4

2 回答 2

5

在这一点上,没有办法在 Rails 中使用与数组的关系。但是,使用选定的答案,您将遇到 N+1 选择问题。假设你得到你的帖子,然后在每个帖子上使用类中定义的“标签”方法为其添加标签。对于您调用标签的每个帖子,您将招致另一个数据库命中。

希望这在未来会有所改变,我们可以摆脱连接表(特别是考虑到 Postgres 9.4 将包括对数组中外键的支持)。

于 2013-08-09T17:00:41.613 回答
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

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

于 2013-03-25T12:10:18.010 回答