在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)
Posted
技术标签:
【中文标题】在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)【英文标题】:Select distinct on id to return a row, but able to access other column values (rails association) 【发布时间】:2012-01-06 06:56:24 【问题描述】:好的,我正在对 Rails 中的关联进行内部连接,如下所示:
@visits = @customer.visits.joins(:messages).select("distinct(visits.id)")
这将返回唯一的访问 ID,但是我想循环访问这些访问,并访问其关联(每次访问也附加了一个 merchant_id
)。这个内部连接的问题是只返回 id 所以当我做这样的事情时:
@visits.each do |v|
merchant = v.merchant
end
我最终得到了一个 nil 类。
如何根据唯一的 visit.id 选择“访问”,同时返回该行中的所有其他列?分组?
【问题讨论】:
看起来我实际上可以使用 .group("evisits.id") 而不是 select 语句来做到这一点。稍后我会将此作为答案发布,但我很想听听其他人怎么说。 【参考方案1】:您选择的只是 id,这是正确的。既然你想要一个对象,你有两个选择。所以你真正想要的是:
Visit.where(:visit_id => @customers.visits.select("distinct(id)"))
这相当于:
"SELECT * FROM VISITS WHERE VISITS.ID IN (SELECT DISTINCT(ID) FROM VISITS WHERE VISITS.CUSTOMER_ID IN ?)", <id_list>
我不确定“消息”在您的架构中的哪个位置,但它基本上只是上述查询中的一个联接。有时,找出 SQL 会很有帮助,如果遇到问题,可以回溯到 ActiveRecord 语法。
【讨论】:
以上是关于在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)的主要内容,如果未能解决你的问题,请参考以下文章