3

これには多くの問題があり、私が SQL で目撃したものとは異なります。HABTM 関係を作成し、オブジェクトを互いに一致させようとしているだけです。

私の 2 つのモデル

class Word
  include MongoMapper::Document         

  many :topics

  key :word, String

end

class Topic
  include MongoMapper::Document         

  many :words

  key :name, String

end

そのモデルの作業だけで、オブジェクトを作成して関連付けることができます。Mongo が好きな理由の一部です。

次に、次のようにいくつかのサンプル yaml を取得しようとします。

Music I Dig:
  reggae:
    bob marley
    isaac hayes
    groundation
  classical:
    philip glass
    bach

そして、この Rakefile でそれを解析しようとしています:

File.open(Rails.root + 'lib/words/disgusting_glass_full_of.yml', 'r') do |file|
  YAML::load(file).each do |topic, word_types|
    puts "Adding #{topic}.."
    @temp_topic = Topic.create name: topic

    @temp_words = word_types.map { |type, words|
      words.split(' ').map{ |word| 
        @word = Word.create type: type, word: word
        @word.topics << @temp_topic
      }
    }
    @temp_topic.words << @temp_words.flatten
  end
end

冗談ではありません。これは私が今まで見た中で最もランダムでぎこちない出力です。2 空でデータのない実際のトピックが作成される量。一部のトピックには関連付けがあり、一部は完了しています。言葉も同じ。いくつかの単語はランダムに関連付けられ、他の単語は関連付けられません。この結果がどのように導き出されたかについては、まったく関係がありません。

問題は、モデルのセットアップ方法にあると思います (多分?)。そうでない場合は、mongo_mapper をスローして Mongoid を試しています。

4

1 に答える 1

4

まず、word_ids と topic_ids がモデルの配列属性であることを指定する必要があります。

  class Topic
    include MongoMapper::Document         

    many :words, :in => :word_ids
    key :word_ids, Array
    key :name, String
  end

class Word
  include MongoMapper::Document         

  many :topics, :in => :topic_ids
  key :topic_ids, Array
  key :word, String

end

また、rake タスクにトピックと単語を保存していることを確認する必要があります。

task :import => :environment do
  File.open(Rails.root + 'lib/test.yml', 'r') do |file|
    YAML::load(file).each do |topic, word_types|
      puts "Adding #{topic}.."
      temp_topic = Topic.create name: topic
      temp_words = []
      word_types.map do |type, words|
        words.split(' ').map do |word|
          word = Word.create type: type, word: word
          word.topics << temp_topic
          word.save
          temp_words << word
        end
      end
      temp_topic.words << temp_words.flatten
      temp_topic.save
    end
  end  
end

それは私に次の出力を与えます:

{
    "_id" : ObjectId("502bc54a3005c83a3a000006"),
    "topic_ids" : [
        ObjectId("502bc54a3005c83a3a000001")
    ],
    "word" : "groundation",
    "type" : "reggae"
}
{
    "_id" : ObjectId("502bc54a3005c83a3a000007"),
    "topic_ids" : [
        ObjectId("502bc54a3005c83a3a000001")
    ],
    "word" : "philip",
    "type" : "classical"
}  ....etc

{
    "_id" : ObjectId("502bc54a3005c83a3a000001"),
    "word_ids" : [
        ObjectId("502bc54a3005c83a3a000002"),
        ObjectId("502bc54a3005c83a3a000003"),
        ObjectId("502bc54a3005c83a3a000004"),
        ObjectId("502bc54a3005c83a3a000005"),
        ObjectId("502bc54a3005c83a3a000006"),
        ObjectId("502bc54a3005c83a3a000007"),
        ObjectId("502bc54a3005c83a3a000008"),
        ObjectId("502bc54a3005c83a3a000009")
    ],
    "name" : "Music I Dig"
}
于 2012-08-15T15:57:23.220 に答える