2

私はモンゴイドを使用しており、次のコードがあります。

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" : "bilbo@jenkins.com",
  "user_id" : ObjectId("5162de8a359f10cbf700000c"),
}

次のクエリで検索しようとしています。

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

理由はわかりませんが、このクエリはメール関連の検索を無視しています。login = "bilbo"=> true の場合、ただし= login = "bilbo@jenkins.com"> nilの場合

それで、私は何を間違っていますか?

4

1 に答える 1

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 = "bilbo@jenkins.com"
=> "bilbo@jenkins.com"
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: ["bilbo@jenkins.com"]>
于 2013-04-09T10:42:17.727 に答える