2017-01-25 3 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.where(user_id:user.id、event_id:self.id)' – Iceman

+1

ありがとうございます!それはより良い解決策です:) –

答えて

0

Eventの単一インスタンスで動作しているが、joinsがクラスメソッドEventであるために動作しない理由があります。

あなたは

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

を行うことによってその回避でしたが、この例では、より良い方法がalltogether参加避け、あなたが参加しなければならないのはなぜMembership直接

Membership.where(user_id: user.id, event_id: self.id) 
関連する問題