2015-05-29 67 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