Мой has_many: из-за ассоциации пользователей, групп и членства возникают проблемы в некоторых методах - PullRequest
0 голосов
/ 01 июля 2011

Я работаю с has_many: через ассоциацию: пользователи присоединяются к группам через членство. У меня возникли проблемы с некоторыми методами, которые я создал в пользовательской модели, чтобы определить, является ли пользователь членом группы, и разрешить пользователю присоединяться и покидать группу. Используя консоль, memberships.find_by_group_id всегда возвращает ноль. Я не уверен, почему, и я думаю, что это может быть способ, которым я настроил свой has_many: через ассоциации, хотя, просматривая его много раз и обращаясь к Railscasts / блогам, кажется, все в порядке. Если вы хотите, чтобы я опубликовал дополнительную информацию, например, 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 голосов
/ 01 июля 2011

Я думаю, что вы ищете ассоциацию :has_and_belongs_to_many (NN), а не :has_many (1-N).

Кажется, что в каждой группе также может быть много пользователей.

Посмотрите официальные руководства по rails на 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 из членства.

...