【问题标题】:ActiveRecord has_many relation prevent orphaned newly created objectActiveRecord has_many 关系防止孤立的新创建对象
【发布时间】:2010-10-17 06:26:10
【问题描述】:

假设我有一个 Comment 模型,它属于 Post 模型。

我想让它创建一个新的 Comment 实例(无论是通过 new、create、find_or_create_by_x 等)将失败(最好引发异常),除非立即设置 Post(或者通过将其作为参数或在创建评论时始终引用帖子,例如 post.cmets.new 或 post.cmets.create)。

我想这样做是因为我想在评论对象中设置一些基于帖子的默认值......所以帖子引用需要立即有效。

实现这一目标的最佳方法是什么?谢谢。

【问题讨论】:

    标签: ruby-on-rails activerecord associations belongs-to


    【解决方案1】:

    我认为,为了让 new 使用此功能,您必须在 after_initialize 中进行操作:

    def after_initialize
      raise "no Post" unless post
    end
    

    虽然看起来有点矫枉过正,因为每次实例化评论时都必须运行它。我会说编写测试以确保正确设置默认值。

    【讨论】:

    • 我不介意领土上的开销。
    【解决方案2】:

    我会在您的评论模型中添加一个验证,如下所示:

    class Comment < ActiveRecord::Base
      validates_presence_of :post_id
    end
    

    然后使用以下命令创建新的 cmets:

    @post = Post.find(params[:post_id])
    
    @post.comments.create(params[:comment])
    

    【讨论】:

    • 这样可以防止没有 post_id 的保存,也不会在没有 post_id 的情况下实例化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多