给定一个允许用户邀请其他用户参加活动的系统:
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
提供其他提示而不是使用实例变量?
答案 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