我正在使用has_many:通過關聯:用戶通過成員資格加入組。我在用戶模型中創建的一些方法遇到問題,以確定用戶是否是組的成員,並允許用戶加入和離開組。使用控制檯,memberships.find_by_group_id
總是返回零。我不確定爲什麼,我認爲這可能是我設置has_many的方式:通過關聯,雖然經過多次查看並諮詢了railscasts/blogs,但似乎沒問題。如果你要我給您寄更多的信息,像schema.db什麼的,讓我知道我的has_many:通過用戶,組和會員的關聯在某些方法中造成麻煩
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
這似乎更容易。但是,我試圖使用has_many:through關聯,因爲我想向連接表中添加更多的字段。我的印象是,HABTM關聯只創建了一個只有兩個字段的連接表 - 您正在加入的兩件事的ID。我對整個事情非常困惑,因爲我希望用戶能夠創建和加入一個組,但是組不能顯然加入用戶。所以它變得非常模糊 – Brian
這就是答案:http://stackoverflow.com/questions/5403819/has-many-through-association說我應該建立不同的關聯,但似乎仍然會實施'成員?','加入!'和'離開!'方法 – Brian