【问题标题】:test if model exists in callback, if it does update, else create测试回调中是否存在模型,如果确实更新,则创建
【发布时间】:2013-03-12 09:58:14
【问题描述】:

我有一个名为 Product 的模型。

p = Product.new(...) and p.save

我想完成以下任务:

如果有另一个产品具有相同的 id(不是 pk),那么我们更新产品,否则我们创建一个新产品。

我认为这可以在 before_save 回调中完成!?

我试过这样

before_save :try, on: :create

def try
   p = Product.where(id: self.id).first
   p and p.update_attributes(...) and return false
   *1
end

*1,此时属性已更新,返回false表示未创建新模型,但我认为数据库已回滚,因为更新未保存。

【问题讨论】:

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


    【解决方案1】:

    您可以使用find_or_create(或find_or_initialize 只初始化而不保存实例)。

    另外:我不会创建一个名为 try 的方法,因为它已经存在尝试一个方法,如果它不存在则返回 nil(而不是异常)。

    例如:

    Product.find_or_create(self.id)
    

    【讨论】:

      【解决方案2】:

      我会做一个upsert

      尽管 ActiveRecord 中不存在此命令。 Here 是一个让你实现这种行为的答案。

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 2012-12-16
        相关资源
        最近更新 更多