2015-05-29 61 views
0

我使用的軌道respond_with發送JSON響應到客戶端關聯,而我試圖找出如何連同where子句中我聯想軌道4 respond_with包括與WHERE

使用 includes選項 respond_with

這裏是我的模型:

class User < ActiveRecord::Base 
    has_many :ratings 
    has_many :movies, through: :ratings 
end 

class Rating < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :movie 
end 

class Movie < ActiveRecord::Base 
    has_many :ratings 
    has_many :users, through: :ratings 
end 

在我的控制器動作,我有:

def create 
    movies = Movie.order("RANDOM()").limit(3) 
    respond_with(movies, include: :ratings) 
    // I'd like to do something like 
    // respond_with(movies, include: :ratings WHERE user: current_user) 

end 

如何有史以來,這是三個電影的所有收視率作出迴應。我想限制它只是特定用戶的

+0

你可以在movies變量上添加一個where語句 - 就像'movies = Movie.where(user_id:@ user.id).order ...' – abbott567

+0

@ abbott567,那是行不通的。在提問者的模式中'Movie'模型沒有'user_id'列。該查詢將引發異常。 –

回答

0

你能做到這一點的收視率:

def create 
    movies = Movie.order("RANDOM()").limit(3) 
    # EDIT 
    # movies = movies.merge(current_user.movies).includes(:ratings) 
    movies = movies.joins(:ratings).merge(current_user.ratings).includes(:ratings) 
    respond_with(movies) 
end 

雖然這沒有多大意義的create行動。

注意

movies上面的查詢將生成的SQL語句(2個命令;請注意,您的某些領域會有所不同,因爲我用你的模型裸版本):

SELECT DISTINCT "movies"."id" FROM "movies" 
INNER JOIN "ratings" ON "ratings"."movie_id" = "movies"."id" 
WHERE "ratings"."user_id" = ? ORDER BY RANDOM() LIMIT 3 

SELECT "movies"."id" AS t0_r0, "movies"."name" AS t0_r1, "movies"."created_at" AS t0_r2, 
"movies"."updated_at" AS t0_r3, "ratings"."id" AS t1_r0, "ratings"."user_id" AS t1_r1, 
"ratings"."movie_id" AS t1_r2, "ratings"."created_at" AS t1_r3, "ratings"."updated_at" AS t1_r4 
FROM "movies" INNER JOIN "ratings" ON "ratings"."movie_id" = "movies"."id" 
WHERE "ratings"."user_id" = ? AND "movies"."id" IN (1) ORDER BY RANDOM() [["user_id", 1]] 
+0

這不起作用 - 我仍然獲得特定電影的所有收視率,但我只希望該用戶對該特定電影的評分爲 – user2635088

+0

@ user2635088,我已更新了我的答案。 –

+0

我真的很困惑 - 雖然這應該工作,我只收到電影表的字段,而不是加入的評級表 – user2635088