1

移行を作成しようとしていますが、次のようになります。

class AddStatusToWorks < ActiveRecord::Migration
  def self.up
    change_table :works do |t|
        t.string :status
    end
  end

  def self.down
    change_table :works do |t|
        t.remove :status
    end
  end
end

つまり、テーブルに既に存在するブール値「完了」に基づいて、「ステータス」に異なるデフォルト値を設定したいということです。完了 = true の場合、ステータス = "完了"。そうでない場合、ステータス = 「作業中」。(ブール値として完全にするのではなく文字列が必要な理由は、ステータスに2つ以上の可能性を持たせたいからです。)それを行う方法はありますか?このようにifステートメントをそこに貼り付けるだけですか

change_table :works do |t|
        t.string :status
           if (:complete == true)
               :value => "complete"
           else
               :value => "wip"
end

ええと、それはまったく正しくないようです。少しグーグルで調べたところ、:default 値を設定できることがわかりましたが、それは私が目指していることではありません。どんなアイデア/ヘルプも素敵です。ありがとう!

4

2 に答える 2

2

デフォルトはまったく必要ありません。新しい列を追加して値を指定するだけです。このようなものが動作するはずです:

def self.up
  change_table :works do |t|
      t.string :status
  end
  Works.reset_column_information
  Works.where(:complete => true).update_all(:status => 'complete')
  Works.where(:complete => [false, nil]).update_all(:status => 'wip')
end

については、移行ガイドを参照してくださいreset_column_information

データベースで直接実行することもできますが、さまざまなブール表現に注意する必要があります (PostgreSQL は't'and 'f'、MySQL は1and 0、SQLite は and を望ん10いますが、Rails は誤って't'and'f'を使用しています ...):

t = connection.quote(true)
connection.execute(%Q{
  update works
  set status = case complete
    when #{t} then 'complete'
    else 'wip'
  end
})
于 2012-09-27T02:36:14.117 に答える
0

レコードが作成されるとすぐにデフォルト値が作成されるため、デフォルトのないフィールドにはまだ値がないことに注意してください。この種のロジックをモデルに移動したいと思うでしょう。おそらく、ActiveRecord コールバック、つまり before_validation または before_save で。

于 2012-09-27T01:58:19.087 に答える