我需要修改SQLite数据库中的列,但由于数据库已经在生产中,我必须以编程方式执行此操作.根据我的研究,我发现为了做到这一点,我必须做到以下几点.
对于应该相对容易的事情而言,这似乎是一项荒谬的工作量.有没有更简单的方法?我需要做的就是更改现有列的约束并为其指定默认值.
这似乎在之前被问过:rails decimal precision和scale
但是,在运行时,change_column迁移:precision或:scale它们实际上并不影响模式或数据库,但db:migrate没有错误运行.
我的迁移文件如下所示:
class ChangePrecisionAndScaleOfPaybackPeriodInTags < ActiveRecord::Migration
def self.up
change_column :tags, :payback_period, :decimal, { :scale => 3, :precision => 10 }
end
def self.down
change_column :tags, :payback_period, :decimal
end
end
Run Code Online (Sandbox Code Playgroud)
但我的架构(和数据)仍然是:
t.decimal "payback_period"
Run Code Online (Sandbox Code Playgroud)
还有其他人有这个问题吗?
谢谢,
玩笑
如果我在创建索引后重命名SQLite Tables/Columns/Rows,旧索引是否仍然可用?
谢谢!
我的用户可以输入和创建价格.我想知道如何制作它,所以当用户输入23.5时,他们得到23.50而不是0.0他们得到0.00.如何添加到t.decimal或我的价格:十进制以下能力?
感谢您的帮助!
答案(:具有规模和精度的价格)
class CreatePrices < ActiveRecord::Migration
def self.up
create_table :prices do |t|
t.string :price_name
t.decimal :price, :precision => 10, :scale => 2
t.date :date
t.timestamps
end
end
def self.down
drop_table :prices
end
end
Run Code Online (Sandbox Code Playgroud)
Schema.rb:
create_table "prices", :force => true do |t|
t.string "price_name"
t.decimal "price", :precision => 10, :scale => 2
t.date "date"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
end
Run Code Online (Sandbox Code Playgroud)
我的脚手架形式:
<%= f.label:price%>
<%= f.text_field:price%>
然后在你的视图中输入number_to_currency(@ model.attribute):
价钱: