2015-11-05 64 views
0

我有三個表,Show,EpisodeCharacter。每個顯示has_many節目和字符。在嵌套連接表上調用uniq

class Show < ActiveRecord::Base 
    has_many :episodes 
    has_many :characters 

class Episode < ActiveRecord::Base 
    belongs_to :show 

class Character < ActiveRecord::Base 
    belongs_to :show 

情節有屬性:air_date:episode_number。顯示有一個屬性:title

我有一個字符列表@characters。我想要完成的是打印與這些角色相關的節目列表,由節目第二集的播出日期排序。

<% @characters.includes(show: :episodes).where(episodes: {episode_number: 2}).order('episodes.air_date DESC').each do |character| %> 
    <%= character.show.title %> 
<% end %> 

這幾乎工作,但一些節目有多個字符,所以在打印列表中,一些節目被多次列出。

是否有可能將紅寶石方法uniq應用於查詢中的Shows表,以便每個Show最多打印一次?

回答

1

一羣人怎麼樣?

<% @characters.includes(show: :episodes).where(episodes: {episode_number: 2}).order('episodes.air_date DESC').group_by(&:show).each do |show, characters| 
    <%= show.title %> 
<% end %> 
0

有一件事我通常會做你的情況是,我看什麼,我要在SQL中完成,寫出來,測試它的效果,然後將其轉化爲ActiveRecord的或在某些情況下保持它作爲使用find_by_sql

所以在這裏自定義SQL查詢你想要什麼SQL來完成:

Show.find_by_sql(<<-SQL, character_ids_array) 
    SELECT 
    DISTINCT ON (shows.id) shows.* 
    FROM 
    characters 
    JOIN 
    shows on characters.show_id = shows.id 
    JOIN 
    episodes on shows.id = episodes.show_id 
    WHERE 
    characters.id IN #{character_ids_array} AND epsiodes.epsiode_number = 2 
    ORDER BY 
    episodes.air_date DESC 
SQL 

這無關你的主要問題,但我會建議在控制器不這樣做你的邏輯在ERB。爲了約定:)

此外,請確保當您翻譯爲ActiveRecord時,您的查詢將兌現至最後以避免N + 1個查詢。