2013-08-07 50 views
1

我有两个表,电影和喜欢。 电影has_many :likes, dependent: :destroy, foreign_key: "movie_id"和一个像belongs_to :movieRails协会

在喜欢控制器 有两个动作:uplikes (where :vote=>1)dislikes (where :vote=>2)

movies/show.html.erb我显示uplikes的量和不喜欢的电影有 这样:

  • 查看show.html.erb

<%= @uplikes.size %>

<%= @dislikes.size %>

  • 控制器def show

@uplikes = Like.where(:movie_id => params[:id], :vote => '1')

@dislikes = Like.where(:movie_id => params[:id], :vote => '2')

这工作得很好。 现在我有什么问题,在索引操作调用时显示电影的好恶和upl​​ikes量movies.each

我从def show动作粘贴上面的控制器代码为def index行动和改变params[:id]params[:movie_id]

但是,当我打电话

<%= @uplikes.size %>

<%= @dislikes.size %>

到视图,它只是显示0

如果我能在控制器摆脱:movie_id => params[:id],,它就会显示所有uplikes的数量和不喜欢的所有的电影,而不是具体的一个。

任何人都有答案?

感谢

+0

使用':vote => 1'而不是传递字符串':vote =>'1'' – MrYoshiji

+0

不,这不会改变任何东西 – PMP

+0

你怎么知道你想在索引动作中显示喜欢的影片?通常索引动作显示所有电影,并且通常不会带有ID参数 – Slicedpan

回答

3

在指数你们都(或者一个子集,由于分页)遍历的电影,是否正确?一个天真的实现将是

控制器

def index 
    @movies = Movie.all 
end 

在index.html.erb

<% @movies.each do | movie | 
      uplikes = movie.likes.where(vote: 1).count 
      dislikes = movie.likes.where(vote: 2).count 
    %> 

     ... output logic here ... 
    <% end %> 

或者你可以在你的电影做以下

。RB

has_many :uplikes, -> {where vote: 1 }, class_name: 'Like' 
has_many :dislikes, -> {where vote: 2}, class_name: 'Like' 

那么你可以使用你的意见movie.uplikes.countmovie.dislikes.count

+1

做类似的工作,建立uplike/dislike关联,应该允许你优化索引中的呼叫Movie.includes(:uplikes,:dislikes)限制查询次数轨道执行。或者甚至可以为它们使用counter_cache。为了避免数据库命中所有) – Doon

+0

我还将为movie_rb方法添加uplikes_count和dislikes_count以将代码移入模型并为不可避免的一天做好准备,将厌恶和厌恶转化为计数器缓存。 – davidfurber