次の(簡略化された)モデルと移行があります。
モデル:
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」にしか設定できません。なんで?「false」が null 制約にどのように違反するかわかりませんよね?
編集: 明確にするために、PostgreSQL と ActiveRecord を使用しています。私が得ているエラーはこれです:
C:/Ruby193/lib/ruby/gems/activerecord-3.2.8/lib/active_record/validations.rb:56:in 'save!' Validation failed: ActiveRecord::RecordInvalid)
モデルから「validates」ステートメントを削除しても、移行から NULL 制約を削除しても、そのエラーが発生します。これは、属性の値を false に設定することと関係があります。ActiveRecord ブール値に奇妙な制約がありますか?