1

假设用户可以在其中向其他用户赠送礼物的应用程序。礼物和用户之间有两种关系(一种是发送者,另一种是接受者)。

根据以下代码,接收器部分似乎无法正常工作,其中在调用关联时创建了礼物但未检索到:

require 'rubygems'
require 'mongoid'

Mongoid.load!("./config/mongoid.yml")

class User
  include Mongoid::Document

  has_many :gifts
  has_many :gifts_sent, class_name: "Gift", as: :sender
end

class Gift
  include Mongoid::Document

  belongs_to :user,   inverse_of: :gifts
  belongs_to :sender, inverse_of: :gifts_sent, class_name: "User"
end

alice = User.create!
bob   = User.create!
gift  = Gift.create! sender: alice, user: bob

puts Gift.where(sender_id: alice.id).count # => 1 (nice)
puts alice.gifts_sent.count                # => 0 (not so nice)

应该如何定义关联使最后一行输出1?

4

2 回答 2

0

你必须给has_many 礼物关系一个inverse_of 。要处理名为gifts_sent 的第二个关系,您必须在定义关系时提及foreign_key 。

class User
  include Mongoid::Document

  has_many :gifts, inverse_of: :user
  has_many :gifts_sent, :foreign_key => :assign_whatever_field, class_name: "Gift", inverse_of: :sender, 
end

礼物模型将是

class Gift
  include Mongoid::Document

  belongs_to :user,   inverse_of: :gifts
  belongs_to :sender,:foreign_key => :assign_whatever_field, inverse_of: :gifts_sent, class_name: "User"
end
于 2013-05-23T10:35:45.570 回答
0

还需要在 User 模型中包含反比关系:

class User
  include Mongoid::Document

  has_many :gifts,      inverse_of: :user
  has_many :gifts_sent, inverse_of: :sender, class_name: "Gift"
end

class Gift
  include Mongoid::Document

  belongs_to :user,   inverse_of: :gifts
  belongs_to :sender, inverse_of: :gifts_sent, class_name: "User"
end
于 2013-05-23T11:17:35.427 回答