我有一个用户实例,它有很多被邀请者但只有一个邀请者。 我正在尝试访问与该用户及其被邀请者相关联的邀请者实例。
即:
user.inviter #=> return another user instance.
user.invitees #=> return a collection on user instances
User.rb 的
class User < ActiveRecord::Base
has_one :inviter, class_name: Invitation, foreign_key: :invitee_id
has_many :invitees, class_name: Invitation, foreign_key: :inviter_id
end
Invitation.rb 的
class Invitation < ActiveRecord::Base
belongs_to :inviter, class_name: User, foreign_key: :inviter_id
belongs_to :invitee, class_name: User, foreign_key: :invitee_id
end
迁移
class CreateInvitations < ActiveRecord::Migration
def change
create_table :invitations do |t|
t.references :inviter, references: :user, index: true
t.references :invitee, references: :user, index: true
t.foreign_key :users, column: :inviter_id
t.foreign_key :users, column: :invitee_id
t.timestamps
end
end
end
这样做的一半是因为如果我在有邀请者的用户上调用user.inviter
,它将返回邀请实例,但不会像我想的那样返回用户。 user.invitees
的相同内容会在邀请实例上返回一个集合。
你们都知道如何让它发挥作用吗?
答案 0 :(得分:0)
您应该使用through这样的选项:
class User < ActiveRecord::Base
has_one :invitation, inverse_of: :inviter
has_one :inviter, through: :invitation
has_many :invitations, inverse_of: :invitee
has_many :invitees, through: :invitations
end
class Invitation < ActiveRecord::Base
belongs_to :inviter, class_name: User, inverse_of: :invitation
belongs_to :invitee, class_name: User, inverse_of: :invitations
end
答案 1 :(得分:0)
user.invitees 会提供邀请记录的集合。 使用 IN 查询用户模型,其中所有invitee_id引用用户模型将为您提供用户集合。
user_ids = user.invitees.map(&:invitee_id)
User.where(id: user_ids)