2013-08-07 92 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