选择与WHERE子句匹配的行,其中不存在共享特定列列值的较新行

时间:2015-11-05 16:04:45

标签: ruby-on-rails postgresql activerecord

我有下表lead_states

它包含以下列:idlead_idstatenotecreated_at

state是枚举列表中的字符串,例如newopenedsoldlost

每当引线改变状态时,都会添加一个新的状态行。

我希望找到特定州的潜在客户。潜在客户的当前状态是该潜在客户的最新lead_state。

所以我基本上希望最终得到像这样的范围:

Lead.in_state('opened')

我已经尝试了该范围的以下实现:

def in_state(state)
  lead_state_scope = LeadState.where(state: state)
  Lead.where(id: lead_state_scope.select(:lead_id))
end

但是,这将返回所有在其生命周期中某个时刻处于查询状态的线索。

1 个答案:

答案 0 :(得分:0)

我会让你打破这个,但是你想要在方法中,但这应该可以得到你所需要的。添加组并将方法添加到内部查询可以解决您的潜在客户生命周期问题,因为它获得了最新的潜在客户状态。

def in_state(state)
    Lead.where(id: LeadState.where(state:state).group(:lead_id).having('created_at = MAX(created_at)').select(:lead_id))
end