如何使用owner_id(而不是user_id)作为外键?

时间:2013-11-21 18:15:16

标签: ruby-on-rails ruby-on-rails-4 many-to-many

我正在构建一个用户创建任意数量的组的应用程序。创建组时,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

2 个答案:

答案 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"

这将区分用户拥有的组与用户所在的组。