2015-12-19 3 views
1

Добрый день!Mongoid не работает должным образом

Я пытаюсь загрузить модель для MongoDB с этим:

User.includes(:party).first 

В режиме отладки для Mongoid Я вижу следующие запросы:

D, [2015-12-19T13:53:19.354800 #3847] DEBUG -- : MONGODB | STARTED | {"find"=>"users", "filter"=>{}} 
D, [2015-12-19T13:53:19.355403 #3847] DEBUG -- : MONGODB | SUCCEEDED | 0.000451s 
D, [2015-12-19T13:53:19.366237 #3847] DEBUG -- : MONGODB | STARTED | {"find"=>"parties", "filter"=>{"user_id"=>{"$in"=>[nil]}}} 
D, [2015-12-19T13:53:19.366626 #3847] DEBUG -- : MONGODB | SUCCEEDED | 0.000307s 

Как вы можете видеть, второй запрос, выполняемый с этим Params :

{"find"=>"parties", "filter"=>{"user_id"=>{"$in"=>[nil]}}} 

Я не могу понять, почему, вот мои модели:

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :nickname,    type: String 
    field :email,     type: String 

    has_one :party 
    has_many :added_songs,  class_name: 'Playlist::Song' 
    has_many :chat_messages,  class_name: 'Chat::Message' 
end 

class Party 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :active, type: Boolean, default: true 
    field :title,  type: String 

    belongs_to :user 
    has_one :chat, class_name: 'Party::Chat' 
    has_one :playlist, class_name: 'Party::Playlist' 
end 

И самое интересное в том, что если я делаю:

Party.includes(:user).first 

Он отлично работает. Спасибо за любую помощь!

ответ

0

Вы не обязательно указывали, что означает «оно работает», но я предполагаю, что вы просто имеете в виду, что он фактически возвращает документ из базы данных. Насколько я могу сказать, ваша нетерпеливая нагрузка работает по назначению.

Вы указываете, что User имеет номер Party. Это означает, что user_id хранится в Party и что party_id является не, хранящийся в User.

Итак, когда вы запустите этот запрос:

User.includes(:party).first 

Это будет специально искать для Party объектов, которые не имеют конкретного User:

"find"=>"parties", "filter"=>{"user_id"=>{"$in"=>[nil]}} 

Так что, если вы сделаете наоборот:

Party.includes(:user).first 

Это не способен сделать это:

"find"=>"users", "filter"=>{"party_id"=>{"$in"=>[nil]}} 

Поскольку нет party_id хранится в User коллекции.

Так что, если вы хотите запустить User.includes(:party).first вы должны попытаться найти конкретный User первое, что-то вроде:

User.where(:_id => "one of your users").includes(:party).first 
+0

Спасибо, это то, что мне нужно! – bgr11n

Смежные вопросы