Встроенные документы MongoMapper

У меня есть продукты в виде встроенного документа внутри класса категории, как показано ниже:

require 'mongo_mapper'

class Category

include MongoMapper::Document

key :Name, String
key :NumberOfProducts, Integer
many :products

end

и вот класс продукта:

require 'mongo_mapper'

class Product

include MongoMapper::EmbeddedDocument

  key :Name, String

end

Я использую следующий код для отображения продуктов, но в нем говорится, что метод «Имя» не найден.

require 'rubygems'
require 'mongo'
require 'mongo_mapper'
require 'category'
require 'product'

include Mongo

MongoMapper.database = 'Northwind'

categories = Category.all()

categories.each{|category| puts category.Name

  unless category.Products.nil?

     category.Products.each{|product| puts product.Name}

  end


}

вот ошибка:

 undefined method `Name' for {"Name"=>"Amiga"}:BSON::OrderedHash (NoMethodError)

person azamsharp    schedule 19.07.2010    source источник


Ответы (3)


Что ж, первое, что нужно попробовать, это то, что у вас есть:

many :products

... но затем вы пытаетесь получить к нему доступ с помощью category.Products.each

Определенно сохраняйте последовательность в именовании, и я бы рекомендовал использовать рубиновые соглашения (подчеркнутые, а не в верблюжьем корпусе и, конечно, без заглавных букв для неклассов).

Так что, может быть:

class Category
  include MongoMapper::Document
  key :name, String
  many :products
end

class Product
  include MongoMapper::EmbeddedDocument
  key :name, String
end


categories = Category.all
categories.each do |category|
  puts category.name
  category.products.each do |product|
    puts "  " + product.name
  end
end
person rfunduk    schedule 19.07.2010
comment
Спасибо, но я перешел на продукты вместо продуктов, поскольку база данных MongoDb сериализовала его как продукты. Еще раз спасибо! - person azamsharp; 19.07.2010
comment
? То, что mongodb сериализует его, не имеет значения, вы используете плагин Ruby и вам нужно следовать его соглашениям (и, вероятно, он следует соглашениям ruby). - person rfunduk; 19.07.2010
comment
Собственно сериализация производилась со стороны .NET (C #)! - person azamsharp; 19.07.2010
comment
Сторона .NET !? Тогда это почти наверняка ваша проблема :) В таком случае я бы просто написал небольшой скрипт с использованием голого драйвера Ruby для очистки данных. - person rfunduk; 19.07.2010
comment
Обычно код .NET записывает данные в базу данных MongoDb, а код Ruby считывает данные. Просто для ВЕСЕЛА! : D - person azamsharp; 19.07.2010

Возвращаемый объект действует как хеш. Чтобы получить доступ к имени, вам нужно использовать product["Name"] или category["Name"].

e.g.

irb(main):007:0> oh.baz
NoMethodError: undefined method `baz' for {"foobar"=>"baz"}:BSON::OrderedHash
    from (irb):7
irb(main):008:0> oh[:foobar]
=> "baz"
person Blaine Lafreniere    schedule 19.07.2010
comment
EmbeddedDocument MongoMapper создает экземпляр класса с соответствующим именем с данными в хэшах, когда вы используете many. Если вам нужны только хэши, вы можете использовать что-то вроде key :products, Array, :default => [], а затем category.products << { :name => 'asdf' } - person rfunduk; 19.07.2010

В вашем контроллере

@categories = Category.all

Вид

<% @categories.products.each do |product| %>
  <%= product.Name %> <br/>
<% end %>
person ruvan    schedule 18.01.2012