【发布时间】:2016-06-26 02:10:51
【问题描述】:
我目前有一个 Rails 应用程序,它允许用户创建组并允许其他用户加入组。组“创建者”是该组的所有者,任何加入 ON REQUEST 的都是成员。我希望用户只能创建一个组,但属于多个组(我认为我已经掌握了这种关系,但我有点不确定)。我需要一点帮助来理解我需要做什么才能在用户页面上显示组关联。我应该如何创建组“显示”页面以及如何在用户“显示”页面上显示组成员身份?我得到了 SO 的帮助,并按照 Railscast on self-referential association 来帮助指导我建立关系。
在此示例中,组称为 Cliqs,成员资格由 has_many :through 控制。我为用户模型使用了设计。
澄清我的问题:我是否正在捕捉我正在尝试建立的关系?我将如何允许用户查看他们所属的组?
顺便说一句,我不确定组创建者是否与组成员相关联。我如何在我的模型/控制器中表示它?
这是我的代码:
组模型:
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :members, through: :cliq_memberships, source: :user
has_many :cliq_memberships
end
会员模式:
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end
用户模型:
class User < ActiveRecord::Base
has_one :owned_group, foreign_key: 'owner_id', class_name: 'Group'
has_many :cliqs, through: :cliq_memberships
has_many :cliq_memberships
.
.
.
end
组控制器:
class CliqsController < ApplicationController
def show
@cliq = Cliq.find(params[:id])
end
def new
@cliq = Cliq.new(params[:id])
end
def create
@cliq = Cliq.create(cliq_params)
if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end
def destroy
end
def cliq_params
params.require(:cliq).permit(:name, :cliq_id)
end
end
组成员控制:
class CliqMembershipsController < ApplicationController
def create
@cliq = cliq.find(params[:cliq_id])
if @cliq_membership.save = current_user.cliq_memberships.build(:cliq_id => params[:cliq_id])
flash[:notice] = "Joined #{@cliq.name}"
else
#Set up multiple error message handler for rejections/already a member
flash[:notice] = "Not able to join Cliq."
end
redirect_to cliq_url
end
def destroy
@cliq = Cliq.find(params[:id])
@cliq_memberships = current_user.cliq_memberships.find(params[cliq_memberships: :cliq_id]).destroy
redirect_to user_path(current_user)
end
end
还有我的用户显示页面:
<h1> <%= @user.username %> </h1>
<h2>Cliqs</h2>
<%= link_to "Create Cliq", new_cliq_path %>
<ul>
<% for cliq_membership in @user.cliq_memberships %>
<li>
<%= cliq_membership.cliq.name %>
(<%= link_to "Leave Cliq", cliq_membership, :method => :delete %>)
</li>
<% end %>
</ul>
<h3>Title:</h3>
<% @uploads.each do |upload| %>
<div>
<%= link_to upload.title, upload_url %>
</div>
<% end %>
还有我的迁移:
点击:
class CreateCliqs < ActiveRecord::Migration
def change
create_table :cliqs do |t|
t.string :name
t.references :owner
t.integer :cliq_id
t.timestamps null: false
end
end
end
CliqMemberships:
class CreateCliqMemberships < ActiveRecord::Migration
def change
create_table :cliq_memberships do |t|
t.references :user
t.references :cliq
t.timestamps null: false
end
end
end
以下工作的完整解决方案。
【问题讨论】:
-
所以用户和 Cliqs 之间有一个桥接表。对于我过去从事的项目,桥接表中有一个
role列,指示用户是管理员、用户还是组的所有者。这种方法在这里行得通吗? -
我将如何实现它?我仍然对 HMT 协会感到有些困惑。
-
HMT?你是说多对多吧?许多用户可以属于许多组,对吗?唯一的限制是用户只能拥有一个组,对吧?
-
就是这样。
标签: mysql ruby-on-rails activerecord has-many-through