【问题标题】:Combining postgres_ext (or Rails 4) arrays with associations将 postgres_ext(或 Rails 4)数组与关联相结合
【发布时间】:2013-03-14 04:53:16
【问题描述】:
我正在尝试在标签(tags 表中)和项目(items 表中)之间建立多对多关系,在每个项目上使用 integer[] 类型的字段。
我知道 Rails 4(和通过 postgres_ext 的 Rails 3)通过 :array => true 参数支持 Postgres 的数组功能,但我不知道如何将它们与 Active Record 关联结合起来。
has_many 有这个选项吗?有这个宝石吗?我是否应该放弃并只创建一个has_many :through 关系(尽管我预期的关系数量可能无法管理)?
【问题讨论】:
标签:
postgresql
rails-activerecord
ruby-on-rails-4
postgres-ext
【解决方案1】:
目前,还没有办法在 Rails 中使用与数组的关系。但是,使用选定的答案,您将遇到 N+1 选择问题。假设你得到你的帖子,然后在每个帖子上使用类中定义的“标签”方法为其添加标签。对于您调用标签的每个帖子,您将招致另一个数据库命中。
希望这在未来会有所改变,我们可以摆脱连接表(特别是考虑到 Postgres 9.4 将支持数组中的外键)。
【解决方案2】:
你真正需要做的就是
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 个相关表)。我不一定要使用活动记录来对数据库做一些很酷的事情。