我正在构建一个用户创建任意数量的组的应用程序。创建组时,owner_id(在组表中)设置为current_user.id
的。
我在显示特定用户拥有的群组时遇到了一些麻烦。请注意,通过GroupMembers表,用户和组之间存在多对多关系。
基于此question,我修改了我的group.rb模型:
class Group < ActiveRecord::Base
has_many :group_members, :dependent => :destroy
has_many :users, :through => :group_members
belongs_to :owner, class_name: User, foreign_key: :owner_id
end
仅向模型添加最后一行(“所有者”)。问题是,当我在视图中显示属于该用户的组时:
<h3>User</h3>
<p>User: <%= @user.name %></p>
<p>Email: <%= @user.email if @user.email %></p>
<p>Groups:
<% @user.groups.each do |group|%>
<%= group.name %>
<% end %>
</p>
没有一个小组出现。似乎我可能需要从UsersController内部显式连接到groups表才能使用它?但我不确定。我不想在兔子洞的地方走太远,所以我正在寻找一些建议。
更新:
这是我的用户模型:
class User < ActiveRecord::Base
has_many :group_members, :dependent => :destroy
has_many :groups, :through => :group_members
rolify
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :invitable, :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
end
答案 0 :(得分:4)
当您抓取@user.groups
时,您使用:groups
模型上的User
关联,该关联独立于has_one :user
上的Group
关联模型。所以你上面提供的代码不是相关的。你需要的是:
class User < ActiveRecord::Base
has_many :groups, foreign_key: :owner_id
end
更新:由于您已经有has_many :groups
关系,因此您需要将此命名为其他内容。如,
class User < ActiveRecord::Base
has_many :owned_groups, foreign_key: :owner_id, class_name: Group
end
然后,您需要更新视图代码以执行@user.owned_groups
而不是@user.groups
,否则您将获取错误的集合。
(ps,Group
模型上的反比关系应该是belongs_to :owner, class_name: User, foreign_key: :owner_id
,而不是has_one
。不同之处在于belongs_to
另一个模型应该保持的模型定义关系的外键,而has_one
关系期望外键位于关联表上。)
答案 1 :(得分:0)
您可以执行类似
的操作# user.rb
has_many :owned_groups, foreign_key: 'owner_id', class_name: "Group"
这将区分用户拥有的组与用户所在的组。