2017-02-28 51 views
0

我一直在努力为此寻找正确的方法。 我有一个通过成员资格关联的用户和组之间的多对多关系。Rails 5使用具有多对多关系的代表

成员资格模型还具有反映当前成员资格状态的归属电话“状态”,即与某个组关联的用户可能是青铜,银或金状态。

我一直无法以合理的方式访问状态,没有太多查询,并且认为必须有更高效的方式。我开始与代表,但无法让它工作。

例如这里是代码

user.rb

class User < ApplicationRecord 
    has_many :memberships 
    has_many :groups, through: :memberships 
end 

group.rb

class Group < ApplicationRecord 
    has_many :memberships 
    has_many :users, through: :memberships 
end 

membership.rb

class Membership < ApplicationRecord 
    belongs_to :user 
    belongs_to :group 

    enum status: [ :bronze, :silver, :gold ] 
end 

现在,在一组的 '秀' 看,我想显示所有成员的用户,所以我这样做:

<% @group.users.each do |user| %> 
    <tr> 
    <td><%= user.id %></td> 
    <td><%= user.email %></td> 
    <td><%= user.memberships.find_by_group_id(@group.id).status %></td> 
    </tr> 
<% end %> 

这有效,但由于我已经通过组成员关系检索了用户的特定实例,因此如果我可以直接引用该用户的状态而不必再次搜索成员关系,那将会很好。
如果可能的话,也许用一个实例方法或委托,这样我就可以有效地调用user.status

回答

0

使简单

<% @group.memberships.each do |membership| %> 
    <tr> 
    <td><%= membership.user.id %></td> 
    <td><%= membership.user.email %></td> 
    <td><%= membership.status %></td> 
    </tr> 
<% end %> 
+1

为了避免'N + 1'问题,我会做这个'@groups .memberships.includes(:user).each do' –