我的应用程序中有以下方法:
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一起使用吗?
答案 0 :(得分:2)
看看this article。
其中一项建议(“选项2”)是在加入之前添加select("distinct photos.*")
。我从来没有这样做但似乎值得一试;当然比将每个选定的字段放入聚合函数更好。