2011-08-04 134 views
0

我的模型是这样的:讨论has_many帖子(嵌套资源)。有一个嵌套父模型指向第一个子模型

我想将starter_post_id列添加到discussions表中,并让它记录'线程起始者帖子ID'。讨论与嵌套形式的帖子一起创建,并且当逻辑应该被调用时,因为讨论的其他帖子将是回复不是初学者帖子

我不知道我在add_column db迁移后需要做什么。

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

回答

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,但我想这是可选的。

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 
+0

谢谢,但对不起,我忘了提及我需要记录这个,因为我需要做一个“最近10次讨论的标题”。我想减少SQL调用的数量。 (讨论标题取自首发帖子标题) – lulalala

相关问题