我的has_many:通过用户,组和成员资格的关联在某些方法中引起了麻烦

时间:2011-07-01 18:15:39

标签: ruby-on-rails ruby-on-rails-3 activerecord associations has-many-through

我正在使用has_many:通过关联:用户通过成员身份加入群组。我在用户模型中创建的一些方法遇到问题,以确定用户是否是组的成员,并允许用户加入和离开组。使用控制台,memberships.find_by_group_id始终返回nil。我不确定为什么,我认为这可能是我设置我的has_many的方式:通过协会,虽然经过多次,多次查看并咨询railscasts / blogs似乎没问题。如果您希望我发布更多信息,例如schema.db或其他内容,请告诉我

class User < ActiveRecord::Base
 has_many :memberships, :dependent => :destroy
 has_many :groups, :through => :memberships
.
.
.
  def member?(group)
    memberships.find_by_group_id(group)
  end

  def join!(group)
    memberships.create!(:group_id => group.id)
  end

  def leave!(group)
    memberships.find_by_group_id(group).destroy
  end
.
.
.
end

class Group < ActiveRecord::Base
 has_many :memberships
 has_many :members, :through => :memberships, :source => :user
 has_attached_file :photo, :styles => { :thumb => "100x100",
                                        :small => "200x200" }
 attr_accessible :name, :description, :private, :created_at, :group_id
 attr_accessible :photo, :photo_file_name, :photo_content_type,
                 :photo_file_size,  :photo_updated_at                                  
end

class Membership < ActiveRecord::Base
 attr_accessible :group_id

 belongs_to :user
 belongs_to :group
end

这是会员控制器:

class MembershipsController < ApplicationController
def create
  @group = Group.find(params[:membership][:group_id])
  current_user.join!(@group)
  respond_to do |format|
    format.html { redirect_to @group }
    format.js
  end
end

def destroy
   @group = Membership.find(params[:id]).group
   current_user.leave!(@group)
   respond_to do |format|
     format.html { redirect_to @group }
     format.js
   end
end

def index
  @memberships = Membership.all
end

end

1 个答案:

答案 0 :(得分:0)

我认为您所寻找的是:has_and_belongs_to_many(N-N)关联而不是:has_many(1-N)关联。

似乎每个群组也可以有很多用户。

查看http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference

上的官方导轨指南

使用:has_and_belongs_to_many关系,将集合(用户)添加到其他集合(成员资格)非常容易。

例如

@membership.users << current_user

会将current_user添加到会员

@membership.users.delete(current_user)

将从会员资格中删除current_user。