【问题标题】:Rails 5 Using delegates with many to many relationshipsRails 5 使用具有多对多关系的委托
【发布时间】:2017-02-28 20:51:38
【问题描述】:

我一直在努力寻找正确的方法。 我在通过会员资格关联的用户和组之间建立了多对多关系。

Membership 模型还有一个属性调用“status”,它反映了当前的会员状态,即与某个组相关联的用户可能是青铜、白银或黄金状态。

在没有大量查询的情况下,我无法以合理的方式访问状态,并且认为必须有更有效的方式。我从代表开始,但无法让它发挥作用。

例如这是代码

用户.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

【问题讨论】:

    标签: ruby-on-rails activerecord delegates


    【解决方案1】:

    简单一点

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

    【讨论】:

    • 为了避免n+1 的问题,我会这样做@groups.memberships.includes(:user).each do
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多