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」にしか設定できません。なんで?「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 ブール値に奇妙な制約がありますか?

4

2 に答える 2

1

特定のエラー情報がないと、質問に答えるのは少し難しいです。

最初に変更attr_readonlyattr_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 に答える