2013-04-08 51 views
2

我使用mongoid,並具有以下代碼:Mongoid:搜索中的has_many關係

class Users::User 
    include Mongoid::Document 
    field :username, type: String 
    has_many :emails, class_name: "Users::Email" 
end 

class Users::Email 
    include Mongoid::Document 

    field :email, type: String 

    belongs_to :user, class_name: "Users::User", inverse_of: :emails 
end 

數據庫:

#users collection 
{ 
    "_id" : ObjectId("5162de8a359f10cbf700000c"), 
    "username" : "bilbo" 
} 

#emails collection 
{ 
    "_id" : ObjectId("5162de8a359f10cbf700000b"), 
    "email" : "[email protected]", 
    "user_id" : ObjectId("5162de8a359f10cbf700000c"), 
} 

我試圖找到與下面的查詢:

Users::User.includes(:emails).any_of({username: login},{"emails.email"=> login}).first 

我不知道爲什麼,但這個查詢忽略了電子郵件關係中的搜索。 當login = "bilbo" => true,但是當login = "[email protected]" =>無

那麼,我在做什麼錯了?

回答

3

你需要一個連接去做你想做的事情,而Mongoid沒有連接。如果您只需要通過用戶訪問電子郵件,則可以對其進行非規範化並將其嵌入到Users::User中。

class Users::User 
    include Mongoid::Document 
    field :username, type: String 
    embeds_many :emails, class_name: "Users::Email" 
end 

class Users::Email 
    include Mongoid::Document 

    field :email, type: String 

    embedded_in :user, class_name: "Users::User", inverse_of: :emails 
end 

這樣一來,就可以在用戶的​​郵件查詢:

irb(main):011:0> login = "[email protected]" 
=> "[email protected]" 
irb(main):012:0> Users::User.any_of({username: login},{"emails.email"=> login}).first 
=> #<Users::User _id: 5163ee96e44f7b0301000001, username: "bilbo"> 

如果Users::Email唯一的財產是email,你可以走得更遠,甚至一步,完全省去了模型,並存儲在字符串中數組:

class Users::User 
    include Mongoid::Document 
    field :username, type: String 
    field :emails, type: Array 
end 

查詢變得更簡單:

Users::User.any_of({username: login},{"emails"=> login}).first 
=> #<Users::User _id: 5163ef95e44f7b6254000001, username: "bilbo", emails: ["[email protected]"]> 
+0

謝謝,我已經明白了。 – ole 2013-04-09 10:53:46

+0

不是'Users :: User.any_of({username:login},{emails:login})。first'沒有雙引號嗎? – 2014-12-20 16:39:21