【问题标题】:Rails: creating a custom data type / creating a shorthandRails:创建自定义数据类型/创建速记
【发布时间】:2010-04-11 15:05:31
【问题描述】:

我想知道如何创建自定义数据类型以在 rake 迁移文件中使用。示例:如果您要创建模型,则可以在迁移文件中添加列。它可能看起来像这样:

  def self.up
    create_table :products do |t|
      t.column :name, :string
      t.timestamps
    end
  end

我想知道如何创建这样的东西:

t.column :name, :my_custom_data_type

例如创建一个“货币”类型的原因,它只不过是一个精度为8,小数位数为2的小数。由于我只使用MySQL,所以这个数据库的解决方案已经足够了。

感谢您的反馈和 cmets!

【问题讨论】:

  • 对货币使用浮点数据类型通常是一个糟糕的主意。
  • 如果您有更好的解决方案,请详细说明。
  • 使用金钱宝石之类的东西,money.rubyforge.org
  • NSD:问题表明他们使用的是十进制,而不是浮点数。
  • theIV:金钱宝石对迁移没有帮助,而这正是 Shyam 想要简化的。

标签: ruby-on-rails ruby code-generation types customization


【解决方案1】:

您要做的是定义一种新的列创建方法,该方法提供创建自定义类型的选项。这基本上是通过在迁移中添加一个行为类似于t.integer ... 的方法来完成的。诀窍是弄清楚在哪里添加该代码。

在你的初始化器目录的某个地方放置这段代码:

module ActiveRecord::ConnectionAdapters
  class TableDefinition
    def currency (*args)
      options = args.extract_options!
      column_names = args
      options[:precision] ||= 8
      options[:scale] ||= 2
      column_names.each { |name| column(name, 'decimal', options) }
    end                                                                     
  end
end

现在您可以使用货币方法在需要时随时定义货币列。

例子:

def self.up
  create_table :products do |t|
    t.currency :cost
    t.timestamps
  end
end

将货币列添加到现有表中:

def self.up
  change_table :products do |t|
    t.currency :sell_price
  end
end   

警告:我没有时间测试它,所以不能保证。如果它不起作用,它至少应该让你走上正轨。

【讨论】:

  • 我将立即对此进行测试。感谢您的努力和帮助!
  • 谢谢,我只是有一个用处。需要注意的一点:tcreate_table 中的 TableDefinition,但 change_table 中的 Table。我将自定义生成代码放入一个模块中,并将其包含在这两个类中。
  • 嗨@emfi 这真的很好..有没有办法像拥有模型货币一样进一步发展?只是一个想法,因为我想要例如也在同一个地方进行货币输入验证..我也会寻找..谢谢
  • 货币验证最好通过去除除小数点以外的所有内容并确保数值来完成。并且仅在显示时格式化货币。
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多