2015-07-12 29 views
0

目標:用戶登錄,並看到他們訂閱的電視節目的下一集節目列表。因此,有三個常規表(用戶,TvShows,Episodes)和一個連接表(訂閱,即加入用戶和TvShow)。如何獲取模型實例及其包含,以及包含'includes?

的車型:

  • TvShow
    • has_many :users, through: :subscriptions
    • has_many :episodes
    • has_many :subscriptions
  • 情節,belongs_to :tv_show
  • 用戶
    • has_many :tv_shows, through: :subscriptions
    • has_many :subscriptions
  • 認購
    • belongs_to :tv_show
    • belongs_to :user

要獲取用戶訂閱的節目列表,我可以說current_user.subscriptions(includes: :tv_show).all。我想要選擇當前用戶的訂閱,包括電視節目,並且包括該節目的內容

如果可能的話,甚至更具體,我想只包括一個插曲:以儘可能低的airtime值插曲(通話時間是劃時代的時間)> Time.now.to_i(即該播出下一集)。

我已經試過在文檔和Google上搜索這個,但是對於我來說這是一個很難用30個字來描述的問題,所以我沒有太多的運氣來解決它。我想在這裏得到一些幫助。

+0

'current_user.joins(:tv_shows)。加入(:劇集)' – max

回答

1

添加HAS_ONE關係,最新一集:

class TvShow 
    has_many :episodes 
    has_one :latest_episode, -> { order(:airtime) }, class_name: 'Episode', 
end 

User.eager_load(tv_shows: :latest_episode).find(1) 

查詢1

SELECT DISTINCT "users"."id" FROM "users" 
LEFT OUTER JOIN "subscriptions" ON "subscriptions"."user_id" = "users"."id" 
LEFT OUTER JOIN "tv_shows" ON "tv_shows"."id" = "subscriptions"."tv_show_id" 
LEFT OUTER JOIN "episodes" ON "episodes"."tv_show_id" = "tv_shows"."id" 
WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 

查詢2

SELECT 
    "users"."id" AS t0_r0, 
    "users"."created_at" AS t0_r1, 
    "users"."updated_at" AS t0_r2, 
    "tv_shows"."id" AS t1_r0, 
    "tv_shows"."created_at" AS t1_r1, 
    "tv_shows"."updated_at" AS t1_r2, 
    "episodes"."id" AS t2_r0, 
    "episodes"."tv_show_id" AS t2_r1, 
    "episodes"."airtime" AS t2_r2, 
    "episodes"."created_at" AS t2_r3, 
    "episodes"."updated_at" AS t2_r4 
FROM "users" 
    LEFT OUTER JOIN "subscriptions" 
     ON "subscriptions"."user_id" = "users"."id" 
    LEFT OUTER JOIN "tv_shows" 
     ON "tv_shows"."id" = "subscriptions"."tv_show_id" 
    LEFT OUTER JOIN "episodes" 
     ON "episodes"."tv_show_id" = "tv_shows"."id" 
WHERE "users"."id" = ? AND "users"."id" IN (1) [["id", 1]] 
+0

雖然 - :latest_episode不會抓取最後一集,但它會將所有內容全部刪除,然後再刪除最新內容。如果每場演出的劇集數量很多,這可能是一個問題。我有一個類似的問題,我解決了一個自定義的Postgres特定的查詢,可以在這裏找到:http://stackoverflow.com/questions/25957558/query-last-n-related-rows-per-row – max

1

試試下面的代碼

current_user.subscriptions.includes({tv_show: :episodes}).where("episodes.airtime > ?", Time.now.to_i) 
+0

儘管事實上episodes.airtime確實存在(我可以發出'SELECT時間段from情節'並獲得結果),但是這種方式失敗,「沒有這樣的列'episodes.airtime'」。嗯... – GreenTriangle

+0

@GreenTriangle你可以在這裏發佈sql生成的查詢嗎? – Pavan

相關問題