2015-09-10 34 views
4

这是一个奇怪的问题。我使用PG搜索以及一些自制课程来填充我网站上的搜索结果。自制课程是用于进一步优化搜索的标签。例如,你搜索食物,你想要有机食物,所以你减少搜索结果的那些没有标签为有机食品。它运行良好很长一段时间。PostgreSQL按表只会有分组错误

这一切都是在我升级到4.2.1 rails之后开始的。

我已经能够跟踪误差特定的代码行:

joins(:tags).where(tags: {id: tag_list }).group("businesses.id").having("count(*) 
= #{tag_list.size}") 

这行代码是以下功能的一部分:

def self.tagged_with_all(tag_list) 
    unless tag_list.empty? 
    joins(:tags).where(tags: {id: tag_list }).group("businesses.id").having("count(*) = #{tag_list.size}") 
    else 
    all 
    end 
end 

错误看起来像这个:

PG::GroupingError: ERROR: column "pg_search_businesses.rank" must 
appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: ...UP BY businesses.id HAVING count(*) = 1 ORDER BY pg_search_... 

所以我想为什么不只是按照错误的建议,并添加pg_search_business.rank骨料所以从上面的麻烦线变为:

joins(:tags).where(tags: {id: tag_list }).group("businesses.id", 
"pg_search_business.rank").having("count(*) 
= #{tag_list.size}") 

这个工程的一部分时间,但pg_search_business.rank并不总是出现在当这个函数被调用。而对于这些时候,如果我使用的代码直接在上面我得到以下错误:

PG::UndefinedTable: ERROR: missing FROM-clause entry for table 
"pg_search_businesses"LINE 1: ...."name" = 'Kid Friendly') 
GROUP BY businesses.id, pg_search_ 

我现在想知道如果有功能的,或者如果范围内检查pg_search_business.rank的存在的可靠方法有对于处理这个特定问题的RoR方式更好。

当方法self.tagged_with_all在pg_search的作用域之外被调用时发生该错误。

我碰到的是两个单独的分组问题,其中一个是我们必须使用pg_search_businesses.rank进行分组,另一个是我们不能使用的分组问题。我正在寻求解决此问题的最佳方法。

在此先感谢您的帮助。我是新来的编程红宝石,这是我的第一个红宝石相关的问题,所以让我知道,如果我可以为您提供更多的信息。

+0

所以有时使用PG搜寻,有时你使用它用于其他目的,当你使用'tagged_with_all'范围是什么? –

+0

这是正确的。让我修改我的问题。 – FujiRoyale

+0

不是一个答案,因为我不知道pg_search的任何信息,但你可以多次调用'.group',它会做正确的事情(即'x.group(:a).group(:b)'是'GROUP BY a,b')。 –

回答

0

谢谢@mu太短

问题被追查到加时设置有问题的功能范围以外的变量。目前,这是跟踪分组时需要的唯一方法。

我添加了下面的逻辑来设置一个全局变量$ GROUP_TEXT

unless q.empty? 
    $group_text = "businesses.id" + "," + " pg_search_businesses.rank" 
    else 
    $group_text = "businesses.id" 
    end 

这里是我添加的代码(这样你可以告诉q是和它是从哪里传来的功能。

def self.search(q) 
    unless q.empty? 
    $group_text = "businesses.id" + "," + " pg_search_businesses.rank" 
    else 
    $group_text = "businesses.id" 
    end 
    unless q.empty? 
     search_text(q) 
    else 
     all 
    end 
    end 

这似乎是一个解决方案,但我仍然开放替代方法来解决这个特定的问题,因为这个感觉有点被黑了。

再次感谢SO和万亩太短