2017-01-25 62 views
0

我想檢查用戶是否是事件的成員。但是得到這個錯誤。加入多對多導軌的查詢

class Event < ApplicationRecord 
    has_many :memberships 
    has_many :users, through: :memberships 

    def has_membership?(user) 
     joins(:memberships).where(memberships: { user_id: user.id }) 
    end 
end 

class User < ApplicationRecord 
    has_many :memberships 
    has_many :events, through: :memberships 
end 

EventsController

def show 
     @event = Event.find_by_id(params[:id]) 
     if @event.has_membership?(current_user) 
      render json: @event, status: 200 
     else 
      render json: { 
       error: "Permission denied" 
      }, status: 422 
     end 
    end 

返回:

undefined method `joins' for <Event:0x000000059a3148> 

但是,如果我嘗試在IRB:Event.joins(:memberships).where(memberships: { user_id: user.id })它顯示正確的數據。

+0

爲什麼你需要加入?你不能直接查詢'Membership'。 'Membership.where(user_id:user.id,event_id:self.id)' – Iceman

+1

謝謝!這是更好的解決方案:) –

回答

0

它不起作用的原因是因爲has_membership?正在處理單個實例Event,但joinsEvent的類方法。

你可以解決,通過做

def has_membership?(user) 
    Event.joins(:memberships) 
    .where(id: self.id) 
    .where(memberships: { user_id: user.id }) 
end 

但在這種情況下一個更好的辦法是避免加入產品總數和查詢Membership直接

Membership.where(user_id: user.id, event_id: self.id)