我正在尝试使用每个项目上的类型字段在标签(tags
表中)和项目(表中)之间建立多对多关系。items
integer[]
我知道 Rails 4(和通过 postgres_ext 的 Rails 3)通过:array => true
参数支持 Postgres 的数组功能,但我不知道如何将它们与 Active Record 关联结合起来。
has_many
有这个选项吗?有这个宝石吗?我应该放弃并建立一种has_many :through
关系(尽管我期望的关系数量可能无法管理)?
我正在尝试使用每个项目上的类型字段在标签(tags
表中)和项目(表中)之间建立多对多关系。items
integer[]
我知道 Rails 4(和通过 postgres_ext 的 Rails 3)通过:array => true
参数支持 Postgres 的数组功能,但我不知道如何将它们与 Active Record 关联结合起来。
has_many
有这个选项吗?有这个宝石吗?我应该放弃并建立一种has_many :through
关系(尽管我期望的关系数量可能无法管理)?
在这一点上,没有办法在 Rails 中使用与数组的关系。但是,使用选定的答案,您将遇到 N+1 选择问题。假设你得到你的帖子,然后在每个帖子上使用类中定义的“标签”方法为其添加标签。对于您调用标签的每个帖子,您将招致另一个数据库命中。
希望这在未来会有所改变,我们可以摆脱连接表(特别是考虑到 Postgres 9.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 个相关表)。我不一定要使用活动记录来对数据库做一些很酷的事情。