Rails:搜索方法打破PostgreSQL,替代方案?

时间:2011-03-28 02:18:28

标签: ruby-on-rails postgresql group-by

我的应用程序中有以下方法:

def self.tagged_with( string )
  array = string.split(',').map{ |s| s.lstrip }
  joins(:tags).where('tags.name' => array ).group('photos.id')
end

这是搜索照片,照片上有很多标签。

此方法采用逗号分隔的标记列表,并返回具有指定名称的关联标记的所有照片。

问题是,它破坏了PostgreSQL,并出现以下错误消息:

ActionView::Template::Error (PGError: ERROR:  column "photos.custom_title" must appear in the GROUP BY clause or be used in an aggregate function
: SELECT  "photos".* FROM "photos" INNER JOIN "taggings" ON "photos"."id" = "taggings"."photo_id" INNER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "tags"."name" IN ('village') AND ("photos".collection_id = 1) GROUP BY photos.id LIMIT 20 OFFSET 0):

在另一个有点类似的问题中,回答者建议每当使用.group()时,必须在表格中包含所有列。这对我来说似乎很疯狂 - 如果您只能通过键入模型中的所有字段来使用它,那么.group的重点是什么。这很脆弱,整体上只是一个坏主意。

有人可以建议另一种方法让这个方法与PostgreSQL一起使用吗?

1 个答案:

答案 0 :(得分:2)

看看this article

其中一项建议(“选项2”)是在加入之前添加select("distinct photos.*")。我从来没有这样做但似乎值得一试;当然比将每个选定的字段放入聚合函数更好。