【问题标题】:Rails, after a record is created, how to automatically create an associated record?Rails,创建记录后,如何自动创建关联记录?
【发布时间】:2017-06-20 23:55:51
【问题描述】:

我有一个 Ratings 模型,用户可以在其中对对象进行评分...在进行评分后,我想自动创建 RatingLog 记录,以便用户可以看到所有评分的列表。

模型:Rating.rb 和 RatingLog.rb

我看到 RatingLog 包括除评级以外的事件列表,例如徽章等...与 StackOverflow 非常相似。

Rails 5 的正确方法是在创建 Rating 后填充 RatingLog.rb...我应该在 Rating.rb 中使用 after_create 吗?我应该创建其他类型的回调吗?很想听听在 Rails 5 中实现上述内容的正确方法是什么。

谢谢

【问题讨论】:

  • after_create 听起来不错..
  • +1 after_create。附带说明:对于与 StackOverflow 非常相似的东西,您应该对您的数据库设计给予一个非常好的想法;并且可能考虑使用服务对象
  • 什么是服务对象???
  • @AnnaSm 检查this aticle 服务对象。

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

我假设你有模型:

class Rating
  has_one :rating_blogs
end

class RatingBlog
  belongs_to :rating
end

所以,要在创建评级后创建评级博客,您可以:

@rating = Rating.new
@rating.build_rating_blog(some_message: 'Message')
@rating.save

所以在创建@rating 时,将创建一个评分博客并与@rating 关联。

【讨论】:

    【解决方案2】:

    我不知道这是否可以考虑...但是我在 create 操作中执行此操作,在您的情况下,我猜想: 评级控制器

    def create
    ...
        @ratinglog = RatingLog.create
            @ratinglog.user = current_user
            @ratinglog.rating = @rating.id
            @ratinglog.comment_type = "server generated"
            @ratinglog.comment = "#{current_user.fname} #{current_user.lname} submitted a rating of #{@rating.content}"
            @ratinglog.save!
    ...
    end
    

    【讨论】:

      【解决方案3】:

      另一个选项是after_commit 回调,它只会在评级对象被保存时运行。

      after_create 也可以,但如果您在尝试保存 RatingLog 时出错,那么您创建的评分记录也将不会保存(结帐 this answer)。

      所以根据你想要的行为,选择一个:

      • after_commit RatingLog 错误不会影响评级保存
      • after_createRatingLog 错误回滚评级保存

      还有:

      1. 从您的帖子中并不完全清楚,但听起来 Rating 和 RatingLog 拥有非常相似的数据??或者,如果 RatingLog 将保存其他事件的日志,则可以将其命名为其他名称。
      2. 看看这个answer on naming conventions——模型文件命名的约定是 rating.rb 和 rating_log.rb

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多