【发布时间】:2018-01-31 15:05:17
【问题描述】:
我的外键有问题。
我有 3 个表:用户、成员和组。
基本上我希望用户能够创建组。用户提供名称、描述并在创建时生成令牌。然后其他用户可以通过成员表加入这个组。 members 表有 user_id 和 group_id。用户可以加入提供 group_id 的组,这不是很酷,我希望用户加入提供令牌的组。
除了他们可以加入令牌之外,一切正常。我的问题是如何使用令牌而不是 group_id ?
我已经尝试过像这样添加外键,但架构中没有发生任何事情:
add_foreign_key :members, :groups, column: :group_id, primary_key: :auth_token
add_foreign_key :members, :groups, column: :auth_token, primary_key: :auth_token
我也尝试在我的模型中添加外键:
belongs_to :group, foreign_key: "group_auth_token"
has_many :members, foreign_key: "group_auth_token", class_name: "Group"
这是我的实际模型以防万一:
组.rb
class Group < ApplicationRecord
has_secure_token :auth_token
has_many :members, :dependent => :destroy
has_many :users, :through => :members
end
用户.rb
class User < ApplicationRecord
has_secure_password
has_many :members, :dependent => :destroy
has_many :groups, :through => :members
end
会员.rb
class Member < ApplicationRecord
belongs_to :user
belongs_to :group
validates :user_id, :presence => true
validates :group_id, :presence => true
validates :user_id, :uniqueness => {:scope => [:user_id, :group_id]}
end
我真的对这一切感到困惑,我很确定答案很明显,但我只是迷路了,有人可以帮助我吗?
谢谢
编辑:看起来还不够清楚,所以我要添加一些内容。当用户创建组时,这就是我的控制器中发生的事情:
def create
@group = Group.new group_params
@group.owner_id = current_user.id if current_user
if @group.save
@user = current_user.id if current_user
Member.create(group_id: "#{@group.id}", user_id: "#{@user}")
flash[:success] = "The Group has been created."
redirect_to group_path(@group)
else
render 'new'
end
end
Member.create 是在组中自动添加用户。如果有人想加入一个组,这就是我的成员控制器中发生的事情:
def create
@member = Member.new member_params
@member.user_id = current_user.id if current_user
if @member.save
flash[:success] = "You Joined the Group."
redirect_to mygroups_path
else
flash.now[:error] = "Something went wrong. Are you in the group already ?"
render 'new'
end
end
当然还有一个表单来创建一个新成员(加入组),用户在控制器中提供 group_id (member_params)。
我希望能够使用令牌而不是 group_id。
编辑 2:
所以我对你的代码 jvillian 有一个错误。我将它粘贴到 MembersController 中。在我的表单中,我将 :group_id 更改为 :auth_token ,这是我的表单:
<%= form_for @member do |f| %>
<%= f.label :auth_token %>
<%= f.text_field :auth_token %>
<%= f.submit "Join the Group" %>
<% end %>
【问题讨论】:
-
你是什么意思'加入提供令牌的组'?你的意思是在用户界面中?如果是这样,则 UI 和记录关联的机制在很大程度上是不相关的。按令牌查找组,然后正常关联。还是我误会了?
-
在 UI 中是。创建组后,其他用户可以通过在成员表中创建记录来加入组。我做了一个表单,用户提供 group_id 和 user_id 来自控制器中的当前用户,因此他们不必在表单中提供它。而不是这个 group_id 我希望用户能够使用令牌。基本上不相关是什么意思?
-
如果您在问题中添加将用户与组关联的(可能是控制器)代码,那么我可以告诉您我的意思。
-
我刚刚编辑了帖子
-
已发布答案。如果您有任何问题,请告诉我。
标签: ruby-on-rails database model foreign-keys ruby-on-rails-5