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,则状态 =“完成”。如果没有,status = "work in progress." (我想要一个字符串而不是作为布尔值保持完整的原因是因为我希望那里能够有两个以上的状态可能性。)知道怎么做吗?我是否像这样在其中粘贴一个 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 想要1and0但是 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 回答