1

ユーザーが他のユーザーにギフトを贈ることができるアプリを考えてみましょう。ギフトとユーザーの間には 2 つの関係があります (1 つは送信者として、もう 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

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 に答える
0

has_many ギフト関係に inverse_of与える必要があります。そして、gifts_sent という名前の 2 番目のリレーションを機能させるには、リレーションを定義する際に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 に答える