2013-05-23 3 views
1

Предположим приложение, где пользователи могут давать подарки другим пользователям. Между даром и пользователем есть две связи (одна как отправитель, а другая - как получатель).Mongoid has_many Отношение return no values ​​

Часть приемника, кажется, не будет работать в соответствии со следующим кодом, где создается подарок, но не извлекается при вызове ассоциации:

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?

+0

Вы sould набор gifts_sent как attr_accessible, метод создания использует массовое присвоение. – drinor

ответ

0

Необходимо включить обратную связь в модели пользователя, а также:

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 
0

Вы должны дать inverse_of to has_many отношения родственников. И для работы второго отношения с именем 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 
Смежные вопросы