[英]Rails 3 using select distinct
我有3張桌子需要加入。
我有Events
, Places
和Boroughs
地方屬於自治市鎮,有很多活動
我想從給定日期的事件列表中檢索所有不同自治市鎮的列表。
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 >
更新:
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 >]
您需要命名您的列,否則ActiveRecord將不知道如何映射它。
Event.where(day_of_week: 2).joins(:place,:borough).select('DISTINCT(boroughs.name) as "bouroughs.name"')
我想我會這樣:
Borough.joins(:events).where(:events => {:day_of_week => 2})
Rails默認會使用內部聯接,因此它將排除沒有匹配事件的所有自治市鎮。 您實際上根本不需要如上所述的放置數據。
從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
首先,給列名起別名,
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.