2013-02-22 42 views
1

我有3個表我需要連接在一起。Rails 3使用選擇不同

我有EventsPlaces,並且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數據庫控制檯工作,但是我的鐵軌控制檯我得到。

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

UPDATE:

Mr.The海象的建議,完美的作品,但我仍然感到困惑,爲什麼走另一條路,當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 >] 

回答

3

您需要命名列或其他的ActiveRecord不知道如何映射它。

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

其實我試過了。仍然得到[#,#,#,#,#,#,#,#,#,#] – holden 2013-02-22 20:25:44

+0

哦,如果您使用的是加入你可能需要用完全限定它表名。我會更新答案。 – 2013-02-22 20:28:42

+0

mmm ...具有相同的效果。不用找了。 – holden 2013-02-23 12:03:40

1

首先,別列名,

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} 
2

我想我會做這樣的:

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

Rails會使用默認的內部連接,所以它會排除不具有匹配事件的任何行政區。所描述的查詢實際上並不需要地方數據。

+0

是的,它應該在Borough類而不是Event類上。 – 2013-02-22 20:49:44

2

鐵軌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