Rails创建记录后,如何自动创建关联记录?

时间:2017-06-20 01:37:02

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

我有一个评级模型,用户可以对某个对象进行评级...评级发生后,我想自动创建一个评级日志记录,以便用户可以看到所有评级的列表。

模型:Rating.rb和RatingLog.rb

我看到RatingLog包括除了评级之外的其他事件列表,比如徽章等......非常类似于StackOverflow。

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

谢谢

3 个答案:

答案 0 :(得分: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相关联。

答案 1 :(得分:0)

我不知道这是否合适......但是我在创建动作中做到了这一点,在你的情况下我猜: RatingController

POST /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "ids": {
            "type": "product",
            "values": [
              "100005",
              "10002010093"
            ]
          }
        },
        {
          "ids": {
            "type": "store",
            "values": [
              "100003",
              "1000201"
            ]
          }
        }
      ]
    }
  }
}

答案 2 :(得分:0)

另一个选项是after_commit回调,只有在保存Rating对象时才会运行。

after_create也可以,但如果您在尝试保存RatingLog时出错,则您创建的评级记录也将无法保存(结帐this answer)。

因此,根据您想要的行为,选择一个:

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

此外:

  1. 你的帖子并不完全清楚,但听起来像评级和评级日志都持有非常相似的数据?或者如果RatingLog将保存其他事件的日志,也可以将其命名为其他事件。
  2. 查看此answer on naming conventions - 模型文件命名的约定是rating.rb和rating_log.rb