Techioz Blog

Mongomapper クエリ収集の問題

概要

ユーザー has_many ミーティングを定義すると、自動的に「user_id」が作成されます。 User コレクションに関連付けるキーと値のペア。何も走れないことを除けば mongo_mapper は、nil または [] を返さずに、この値を使用して検索します。

Meeting.first(:user_id => “1234”)

Meeting.all(:user_id => “1234”)

Meeting.find(:user_id => “1234”)

すべて nil を返します。別の構文はありますか?基本的に、自動生成された関連付けられた ObjectId に対してクエリを実行することはできません。



# Methods

class User
  include MongoMapper::Document

  key :user_name, String, :required => true
  key :password, String

  many :meetings
end

class Meeting
  include MongoMapper::Document

  key :name, String, :required => true
  key :count, Integer, :default => 1
end


# Sinatra

get '/add' do
  user = User.new
  user.meetings  "foobar") #should read: Meeting.new(:name => "foobar")
  user.save
end

get '/find' do
  test = Meeting.first(:user_id => "4b4f9d6d348f82370b000001") #this is the _id of the newly create user
  p test # WTF! returns []
end

解決策

ジミーが Meeting.all の確認について述べたように、何もないと思います。

上記の例に基づいて、いくつかの潜在的な問題がわかります。 - ユーザーには :user_name が必要なので、保存されません - 必須の名前を設定していないため、保存されることはありません - 会議も保存されません - もう 1 つ、ミーティングを user.meetings に連結する必要があります。

これはmongo_mapper 0.6.10で動作します

require 'rubygems'
require 'mongo_mapper'
MongoMapper.database = "meetings"

class User
  include MongoMapper::Document

  key :user_name, String, :required => true
  key :password, String

  many :meetings
end

class Meeting
  include MongoMapper::Document

  key :name, String, :required => true
  key :count, Integer, :default => 1
end

user = User.create(:user_name => "Rubyist")
user.meetings  << Meeting.create(:name => "foobar")
user.save

Meeting.first(:user_id => user.id)
User.find(user.id).meetings

もうお気づきかもしれませんが、お役に立てば幸いです。