has_one与定义为MongoMapper和MongoDB的嵌入式文档的键

时间:2010-06-15 18:36:43

标签: mongodb mongomapper

源代码是

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

当我执行target_feed.real_time_detail = RealTimeDetail.new(:url =>“http://example.com”时,:method =>“get”)

我出错了。

相反,我已将TargetFeed更改为

class TargetFeed
  include MongoMapper::Document  

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

end

这有效,但想知道这是否是最佳方式。

2 个答案:

答案 0 :(得分:0)

您的课程不再继承ActiveRecord,而has_one属于ActiveRecord,因此无法使用。使用明确的key似乎会起作用。

答案 1 :(得分:0)

MongoMapper使用不同的语法来实现数据模型之间的关联。详情请见http://mongomapper.com/documentation/plugins/associations.html

缺点是has_one

而不是one
class TargetFeed
  include MongoMapper::Document  

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

end

我相信由于您已将RealTimeDetail定义为嵌入式文档,因此您无需在RealTimeDetail的定义中声明关联。如果RealTimeDetail包含Document(而不是EmbeddedDocument),你可以从它的结尾使用belongs_to:

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