不知道为什么MongoMapper无法处理有多少关系的属性

时间:2012-08-15 00:01:49

标签: ruby-on-rails mongodb yaml mongomapper has-and-belongs-to-many

这充满了问题,而不像我用SQL看到过的任何东西。我只是想创建一个HABTM关系并使对象相互匹配。

我的两个模特

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。

1 个答案:

答案 0 :(得分: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"
}