让嵌套的父模型指向第一个子模型

时间:2011-08-04 04:27:57

标签: ruby-on-rails ruby-on-rails-3

我的模型是这样的:讨论has_many帖子(嵌套资源)。

我想在starter_post_id表中添加discussions列,并让它记录'thread starter post id'。讨论是与嵌套表单中的帖子一起创建的,并且当应该调用逻辑时,因为该讨论的其他帖子将回复而不是首发帖子。 / p>

我不确定在add_column db迁移后我需要做什么。

  1. 我的讨论模型中是否需要belongs_to :post
  2. 这些嵌套对象的创建顺序是什么。例如父母的创作在孩子开始之前就结束了?或者父构造函数会调用子构造函数吗?
  3. 入门者分配逻辑应该使用哪种模型?这与Q2有关,因为两个对象都需要启动,但最好是在DB调用之前。

2 个答案:

答案 0 :(得分:0)

我会使用你发布模型的created_at字段来确定讨论的starter_post。不需要任何列。

在讨论模型中添加类似的内容

def starter_post
  self.posts.order("created_at ASC").first()
end

如果你在discussion.rb中使用它:

has_many :posts , :order => "created_at ASC"

然后你可以简单地使用:

def starter_post
  self.posts.first()
end

答案 1 :(得分:0)

我尝试过before_save并且它不起作用,因为在那个时候讨论无法掌握起始帖子对象。我被指出要使用after_create。

def after_create
    self.starter_post_id = self.posts.first.id
    self.save!
end

这将导致一个额外的SQL查询,但它比在post模型中执行它更好。

我使用了belongs_to所以我可以使用discussion.start_post_id,但我想这是可选的。