如何在mongoid中保存嵌入式类?

Hel*_*rld 1 ruby-on-rails mongodb mongoid ruby-on-rails-3

我正在使用带有mongoid 2的Rails 3.我有一个mongoid类论坛,它嵌入了很多主题.主题embeds_many forumposts

当我试图保存一个forumpost在我的控制器中执行以下操作时...

@forum = Forum.find(params[:forum_id])
@forum.topics.find(params[:topic_id]).forumposts.build(:topic_id => params[:forumpost][:topic_id], :content => params[:forumpost][:content], :user_id => current_user.id,:posted_at => Time.now, :created_at => Time.now, :updated_at => Time.now)
if @forum.save
Run Code Online (Sandbox Code Playgroud)

救了我得...

未定义的方法`每个'为2012-11-14 23:15:39 UTC:时间

为什么我会收到这个错误?

我的forumpost课程如下......

class Forumpost
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

  field :content, type: String
  field :topic_id, type: String
  field :user_id, type: String
  field :posted_at, type: DateTime

    attr_accessible :content, :topic_id, :user_id, :posted_at, :created_at, :updated_at

  validates :content, presence: true
  validates :topic_id, presence: true
  validates :user_id, presence: true

    belongs_to :topic
    belongs_to :user

end
Run Code Online (Sandbox Code Playgroud)

Spo*_*tor 7

您的示例代码有很多错误/很奇怪,所以让我们看看我们是否可以从头开始:

你说论坛嵌入了许多主题,其中嵌入了许多帖子.但您的模型使用的是belongs_to关联.Belongs_to用于与嵌入文档不同的引用.如果你的Topic模型有这个:

class Topic
  ...
  embeds_many :forumposts
  ...
end
Run Code Online (Sandbox Code Playgroud)

然后你的Forumpost模型应该有:

class Forumpost
  ...
  embedded_in :topic
  ...
end
Run Code Online (Sandbox Code Playgroud)

阅读参考文献与嵌入式文档:http://mongoid.org/en/mongoid/docs/relations.html

接下来,您不需要将:topic_id放入forumpost中,因为您正在构建它.

接下来,请不要保存论坛,保存forumpost.而不是进行构建然后进行保存,尝试将其作为一次创建.

接下来,请尝试设置user => current_user,而不是设置user_id => current_user.id.这是belongs_to关联提供的神奇之处......它更清洁,避免弄乱ID.

接下来,为什么你需要created_at(由Mongoid :: Timestamps提供)和posting_at?

最后一点,您不需要设置时间戳,它们应该在创建/更新时自动设置(除非出于某种原因,您实际上需要使用posting_at).

尝试更像这样的东西:

@forum = Forum.find(params[:forum_id])
@topic = @forum.topics.find(params[:topic_id])
if @topic.forumposts.create(:content => params[:forumpost][:content], :user => current_user)
  #handle the success case
else
  #handle the error case
end   
Run Code Online (Sandbox Code Playgroud)