0

我有以下(简化的)模型和迁移:

模型:

class User < ActiveRecord::Base
  attr_readonly :contacted

  validates :contacted, :inclusion => { :in => [true, false] }

  def set_contacted
    self.contacted = true
  end

  def unset_contacted
    # self.contacted = false
    self.contacted = "0"
  end
end

移民:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.boolean :contacted,     :null => false, :default => false

      t.timestamps
    end
  end
end

正如您在我的模型中的评论中看到的那样,将变量设置contact为 false 会导致错误 - 我只能将其设置为“0”。为什么?我看不出“假”如何违反空约束,对吧?

编辑: 为澄清起见,我使用的是 PostgreSQL 和 ActiveRecord。我得到的错误是这样的:

C:/Ruby193/lib/ruby/gems/activerecord-3.2.8/lib/active_record/validations.rb:56:in 'save!' Validation failed: ActiveRecord::RecordInvalid)

即使我从模型中删除“验证”语句,即使我从迁移中删除 NULL 约束,我也会收到该错误。这与将属性的值设置为 false 有关。ActiveRecord 布尔值是否有一些奇怪的约束?

4

2 回答 2

1

在没有具体错误信息的情况下回答您的问题有点困难。

首先,我将更attr_readonly改为attr_accessible- 所以该字段将是可更新的。

其次,我会重写你的方法:

  def unset_contacted
    self.contacted = false
    self.save! # Saving your methods (the ! is for throwing an exception if it fails).
  end
于 2012-11-30T09:01:05.360 回答
0

似乎没有人能够解决这个问题,但这对我来说不再是问题。使用 state_machine gem 可以更好地服务于我的模型,因此我完全删除了该字段。

于 2012-12-08T06:42:57.007 回答