ruby-on-rails - ActiveRecord 更新不更新我的专栏

标签 ruby-on-rails ruby activerecord ruby-on-rails-4

我正在处理一个 RoR 项目,我正在尝试更新列的日期时间。我创建的列称为“deleted_at”,接下来是 Controller 中的代码:

def destroy
    p DateTime.now
    p Time.now.to_formatted_s(:db)
    domain = Domain.find(params[:id])
    p "RECORD: " + domain.domain.to_s
    domain.update(deleted_at: Time.now.to_formatted_s(:db))

    respond_to do |format|
        format.html { redirect_to @domain, notice: 'Domain was successfully deleted' }
        format.js { render action: "destroy" }
    end
end

如果我尝试更新另一个不同的列,例如域名,我可以毫无问题地完成。否则,更新 deleted_at 列是不可能的。我尝试了很多不同的方法,但一无所获。

这是执行 destroy 方法时来自 Rails 控制台的日志:

Started DELETE "/domains/28" for 10.0.2.2 at 2013-09-06 12:56:35 +0000
Processing by DomainsController#destroy as JS
  Parameters: {"id"=>"28"}
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 13 ORDER BY `users`.`id` ASC LIMIT 1
Fri, 06 Sep 2013 12:56:36 +0000
"2013-09-06 12:56:36"
  Domain Load (0.3ms)  SELECT `domains`.* FROM `domains` WHERE `domains`.`id` = 28 LIMIT 1
"RECORD: www.example.com"
   (0.3ms)  BEGIN
  Domain Load (0.6ms)  SELECT `domains`.* FROM `domains` WHERE `domains`.`domain` = 'www.example.com' AND `domains`.`user_id` = 13 LIMIT 1
   (0.4ms)  ROLLBACK
  Rendered domains/destroy.js.erb (0.1ms)
Completed 200 OK in 104ms (Views: 90.0ms | ActiveRecord: 2.0ms)

如您所见,日期时间格式正确并且打印正确,但更新方法实际上执行的是 SELECT 而不是 UPDATE。

我的 friend 怎么了?

谢谢。

编辑 ------------------

感谢大家,我找到了问题(虽然还不是解决方案)。这是一个验证规则。我打印了错误并得到了:

ERROR: You already have this domain in use.

此消息由 (domain.rb) 引发:

class Domain < ActiveRecord::Base

    validate :domainIsUnique?

    private

    def domainIsUnique?

        if Domain.find_by domain: domain, user_id: user_id
            # Domain and user_id found, throwing error
            errors.add(:domain, "You already have this domain in use.")
        end
    end
end

因此,我无法更新任何内容,因为此验证总是搞砸了流程。我不明白的是,如果我只是更新而不是添加,为什么这个验证会自行提升......

最佳答案

为什么要使用自定义验证?您应该能够确定唯一性验证的范围

class Domain < ActiveRecord::Base
    validates :domain, presence: true, uniqueness: {scope: :user_id}
end

应该做与您的自定义相同的事情。并且应该也可以在更新上正常工作。

http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of

因为这个版本会忽略更新本身的记录,而你的版本不会这样做,因此你得到验证失败的原因。

关于ruby-on-rails - ActiveRecord 更新不更新我的专栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18658568/

相关文章:

mysql - 使用 SubSonic 检索一列值的最简单方法是什么(列不是主要的)

ruby-on-rails - Ruby-Tire等待索引创建

ruby-on-rails - Rails 5 - 如何获取 activerecord 的 serializable_hash?

ruby-on-rails - 为什么仍然可以在 View 中访问私有(private)辅助方法?

sql - Rails STI 与子类的关联

ruby-on-rails - 将 JSON 数组转换为 Activerecord 模型数组?

html - scss mixin 在 haml 文件中不起作用

ruby-on-rails - 设计 Ahoy 跟踪链接访问

ruby-on-rails - 你的 Ruby 版本是 2.3.1,但是你的 Gemfile 指定了 2.4.1

ruby - 使用 Bundler 从 Github 安装 gem