【问题标题】:Select distinct on id to return a row, but able to access other column values (rails association)在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)
【发布时间】: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 语句来做到这一点。稍后我会将此作为答案发布,但我很想听听其他人怎么说。

标签: sql ruby-on-rails activerecord ruby-on-rails-3.1 inner-join


【解决方案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 语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多