渴望使用实例变量加载自定义连接

时间:2015-06-02 19:39:11

标签: ruby-on-rails ruby

给定一个允许用户邀请其他用户参加活动的系统:

class Event
  has_many :invites
end

class User
  has_many :invites
  has_many :invited, inverse_of: :inviter, foreign_key: :inviter_id, class_name: 'Invite'
end

class Invite
  belongs_to :user
  belongs_to :event
  belongs_to :inviter, class_name: 'User'
  has_many :invited, -> (invite) { where(invites: { event_id: invite.event_id }) }, through: :user, class_name: 'Invite'
end

我正在生成一个简单的报告,显示事件的所有邀请。我正在尝试修改报告,以便还包含针对示例事件针对invited执行的一些操作:

<%- event.includes(:user).each do |invite| -%>
  <%= invite.user.name %>
  <%- invite.invited.each do |other| -%>
    <%= link_to invite_path(other), method: :destroy do %>
      ...
    <% end %>
  <%- end -%>
<%- end -%>

这很好但有N + 1问题。尝试加载自定义关联会产生:

  

DEPRECATION WARNING:关联范围“invite”与实例有关(范围块采用参数)。预加载在创建单个实例之前发生。这意味着没有实例传递给关联范围。这很可能导致行为破裂或不正确。这些关联的加入,预加载和预先加载已弃用,将来会被删除。

有没有办法做这样的急切加载?是否可以向has_many提供其他提示而不是使用实例变量?

2 个答案:

答案 0 :(得分:0)

请参阅Rails 5 how to form association between tables on multiple shared attributes

您可能需要定义两个不同的关联。一个特定于实例,另一个在连接期间使用。

答案 1 :(得分:0)

尝试仅使用事件端的关系。喜欢:

class Invite
  belongs_to :user
  belongs_to :event
  belongs_to :inviter, class_name: 'User'

  def invited
    event.invites.includes(...)
  end
end