如何在Sinatra上使用Sequel with Postgres避免重复连接查询?

时间:2013-11-18 08:15:03

标签: ruby postgresql sinatra sequel

我想做一个简单的加入。我有两张桌子:"候选人"和"笔记"。

并非所有候选人都有关于他们的笔记,有些候选人有不止一个关于他们的笔记。候选表中的链接字段为id,注释表中为candidate_id。查询是:

people = candidates.where(:industry => industry).where("country = ?", country).left_outer_join(:notes, :candidate_id => :id).order(Sequel.desc(:id)).map do |row|
  {
    :id => row[:id],
    :first => row[:first],
    :last => row[:last],
    :designation => row[:designation],
    :company => row[:company],
    :email => row[:email],
    :remarks => row[:remarks],
    :note => row[:note]
  } 
end

它工作得很好并且从候选表中获取所有指定的候选人和来自注释表的注释,但是在有多个注释的情况下它会重复候选人的姓名。在结果列表中,person" abc"出现两次或三次,具体取决于与该人相关的笔记数量。

我实际上并没有在HTML结果中打印这些笔记只是一个" tick"如果那个人有笔记和" - "如果没有笔记。

我希望这个人的名字只出现一次。我尝试在查询中的每个可能的位置添加distinct,但它没有任何区别。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

为了使distinct能够工作,您需要确保只选择要区分的列。您可以尝试将其添加到查询

.select(:candidates__id, :first, :last, :designation, :company, :email, :remarks, Sequel.as({:notes=>nil}).as(:notes)).distinct

但是你可能最好使用subselect而不是join来检查笔记是否存在(假设你正在使用一个像样的数据库):

candidates.where(:industry => industry, :country=>country).select_append(Sequel.as({:id=>DB[:notes].select(:candidate_id)}, :note)).order(Sequel.desc(:id)).map do |row|
  { :id => row[:id], :first => row[:first], :last => row[:last], :designation => row[:designation], :company => row[:company], :email => row[:email], :remarks => row[:remarks], :note => row[:note] } 
end