2010-06-15 5 views
0

Le code source esthas_one par rapport à la définition comme pour les documents intégrés pour MongoMapper et MongoDB

class RealTimeDetail 
    include MongoMapper::EmbeddedDocument 
    key :url, String 
    key :method, String 
end 

class TargetFeed 
    include MongoMapper::Document 

    key :name, String, :null => false 
    key :feed_type, String, :null => false 
    has_one :real_time_detail 

end 

Quand je fais target_feed.real_time_detail = RealTimeDetail.new (: url => "http://example.com",: method = > "get")

Je me suis trompé.

Au lieu de cela je l'ai changé TargetFeed à

class TargetFeed 
    include MongoMapper::Document 

    key :name, String, :null => false 
    key :feed_type, String, :null => false 
    key :real_time_detail, RealTimeDetail 

end 

Cela fonctionne, mais se demandait si cela est la meilleure façon de s'y prendre.

Répondre

0

Vos classes n'héritent plus de ActiveRecord, et has_one appartient à ActiveRecord, donc il n'est pas disponible pour l'utilisation. L'utilisation d'un key explicite semble fonctionner.

0

MongoMapper utilise une syntaxe différente pour implémenter des associations entre des modèles de données. Détails ici: http://mongomapper.com/documentation/plugins/associations.html

court de c'est, au lieu de has_one, utilisez one

class TargetFeed 
    include MongoMapper::Document 

    key :name, String, :null => false 
    key :feed_type, String, :null => false 
    one :real_time_detail 

end 

Je crois que depuis que vous avez défini RealTimeDetail en tant que document intégré vous n'avez pas besoin de déclarer une association la définition de RealTimeDetail. Si RealTimeDetail incluait Document (au lieu de EmbeddedDocument), vous utiliseriez belongs_to à partir de la fin:

class RealTimeDetail 
    include MongoMapper::Document 
    key :url, String 
    key :method, String 
    belongs_to :target_feed 
end 
Questions connexes