6

结合使用我试图在每个标记(在tags表中)和项目(在items表中)之间使用类型integer[]的字段开发多对多关系项目。将postgres_ext(或Rails 4)数组与关联

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

请问has_many有这个选项吗?这有没有宝石?我应该放弃并且创造一种关系(尽管我期望这种关系的数量可能难以管理)?

回答

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个相关表以获取名称)。我不一定非得使用活动记录才能对数据库做很酷的事情。

5

在这一点上,没有办法在Rails中使用与数组的关系。尽管使用选定的答案,您将遇到N + 1选择问题。假设你在每个帖子上使用类中定义的“标签”方法获取你的帖子,然后获取它的标签。对于您打开标签的每篇文章,您都会触发另一个数据库。

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