2017-01-25 61 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)