【问题标题】:Rails 3 using select distinctRails 3 使用 select distinct
【发布时间】:2013-02-22 20:18:37
【问题描述】:

我有 3 个表需要连接在一起。

我有EventsPlacesBoroughs

地方属于自治市镇并有许多活动

从给定日期的事件列表中,我想检索所有不同行政区的列表。

Event.where(day_of_week: 2).joins(:place,:borough).select("DISTINCT(boroughs.name) AS name")

生成 SQL:

SELECT DISTINCT(boroughs.name) AS name FROM "events" INNER JOIN "places" ON "places"."id" =        
"events"."place_id" INNER JOIN "places" "places_events_join" ON "places_events_join"."id" = 
"events"."place_id" INNER JOIN "boroughs" ON "boroughs"."id" = 
"places_events_join"."borough_id" WHERE "events"."active" = 't' AND "events"."day_of_week" = 3

当我将它放入我的 postgres DB 控制台时,它看起来很完美并且可以工作,但是对于我的 rails 控制台,我得到了。

#<Event >, #<Event >, #<Event >, #<Event >, #<Event >, #<Event >, #<Event >, #<Event >, #<Event >, #<Event >

更新:

Mr.The Walrus 的建议非常有效,但我仍然很困惑,为什么当 SQL 本身产生相同的结果时,反过来却行不通。

Borough.joins(:events).where(:events => {:day_of_week => 2}).select("DISTINCT(boroughs.name) AS name")

生产:

[#<Borough name: "richmond">, #<Borough name: "southwark">, #<Borough name: "brent">, #<Borough name: "city of london">] 

但是这个

Event.where(:events => {:day_of_week => 2}).joins(:borough).select("DISTINCT(boroughs.name) AS name")

生产:

[#<Event >, #<Event >, #<Event >, #<Event >, #<Event >] 

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 select distinct


    【解决方案1】:

    您需要为您的列命名,否则 ActiveRecord 将不知道如何映射它。

    Event.where(day_of_week: 2).joins(:place,:borough).select('DISTINCT(boroughs.name) as "bouroughs.name"')
    

    【讨论】:

    • 其实我试过了。还是得到[#,#,#,#,#,#,#,#,#,#]
    • 哦,如果您使用的是连接,您可能需要使用表名完全限定它。我会更新答案。
    • 嗯...具有相同的效果。没有变化。
    【解决方案2】:

    我想我会这样做:

    Borough.joins(:events).where(:events => {:day_of_week => 2})
    

    Rails 默认使用内部连接,因此它会排除任何没有匹配事件的自治市镇。如上所述,您实际上根本不需要用于查询的地点数据。

    【讨论】:

    • 是的,它应该在 Borough 类而不是 Event 类。
    【解决方案3】:

    从 Rails 3.2 开始,尝试Pluck

    Event.where(:events => {:day_of_week => 2}).joins(:borough).uniq.pluck('boroughs.name')
    

    应该可以。

    如果您打算将它与预先警告的范围链接,延迟加载将导致它无法按预期工作,而是执行类似的操作

    def self.somemethod
      joins(:borough).pluck('boroughs.name').uniq
    end
    

    【讨论】:

      【解决方案4】:

      首先,给列名取别名,

      select("DISTINCT boroughs.name as borough_name")
      

      然后将该名称作为字段访问。

      events = Event.where(day_of_week: 2).joins(:place,:borough).select("DISTINCT boroughs.name as borough_name")
      events.map{|event| event.borough_name}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-25
        • 2015-05-30
        相关资源
        最近更新 更多