在Rails迁移不起作用的情况下更改列数据类型(使用PG DB)

时间:2012-07-13 13:18:31

标签: ruby-on-rails attributes migration type-conversion

我在更改特定模型属性(即钱)的数据类型时遇到问题。 Money是一个整数 - 我正在尝试使用迁移将其更改为十进制,精度为5,标度为2.执行迁移后,控制台中的所有内容都显示正常(即,迁移似乎有效) ,但是当我在Web应用程序中将值更改为小数时,我会收到“无效值”消息。出于某种原因,错误似乎发生在客户端(这是一个js弹出窗口)?我没有包含任何客户端验证。以下是我采取的步骤:

首先,我生成迁移:

>rails generate migration change_data_type_for_user_money

然后,我编辑迁移。这是它的样子:

class ChangeDataTypeForUserMoney < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.change :money, :decimal, :precision => 5, :scale => 2
    end
  end

  def self.down
    change_table :users do |t|
      t.change :money, :decimal, :precision => 5, :scale => 2
    end
  end
end

然后我做了'rake db:migrate'

奇怪的是,小数点后面的零出现并且没有问题(例如100.00是正常的,但是当我得到错误时100.50就是这样)

此外,这是模型:

class User < ActiveRecord::Base
  attr_accessible :money, :name

  validates :money, :name, :presence => true
  validates :money, :numericality => true
end

和_from视图:

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :money %><br />
    $<%= f.number_field :money %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

有什么想法?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

不确定,但请尝试:

class ChangeDataTypeForUserMoney < ActiveRecord::Migration
  def change
    change_table :users do |t|
      t.decimal :money, :precision => 5, :scale => 2
    end
  end
end

编辑:原来问题不在于迁移,而在于验证器。解决方案是改变:&lt;%= f.number_field:money%&gt;至&lt;%= f.text_field:money%&gt;根据我在下面的评论。