用多对多的rails连接查询

时间:2017-01-25 17:00:56

标签: mysql ruby-on-rails

我想检查用户是否是活动的成员。但是得到了这个错误。

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 })它会显示正确的数据。

1 个答案:

答案 0 :(得分: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)