为什么 column_types 方法在 Rails 5.0 中未定义?

why the method column_types is undefined in Rails 5.0?

我正在为 class 赋值,它在 rspec 测试中使用 column_types 方法。

  it "User database structure in place" do
        expect(User.column_names).to include "password_digest", "username"
        expect(User.column_types["username"].type).to eq :string
        expect(User.column_types["password_digest"].type).to eq :string
        expect(User.column_types["created_at"].type).to eq :datetime
        expect(User.column_types["updated_at"].type).to eq :datetime

结束

错误:当我在命令行中 运行 rpsec 时。
Rails5.0
Ubuntu 14.10

Failure/Error: expect(User.column_types["username"].type).to eq :string

 NoMethodError:
   undefined method `column_types' for #<Class:0x000000053a0188>
   Did you mean?  columns
                  column_names
 # ./spec/assignment_spec.rb:67:in `block (5 levels) in <top (required)>'
 # ./spec/assignment_spec.rb:14:in `block (2 levels) in <top (required)>'

看起来像 rails 5,column_types 方法不再存在

该方法已在 this commit 中删除。找到它并不容易。

但是,原因是没有记录,因为方法本身没有记录(也许它只是供内部使用)。

this comment:nodoc:存在时的方法:

def column_types # :nodoc:
    @column_types ||= columns_hash.transform_values(&:cast_type).tap do |h|
      h.default = Type::Value.new
    end
  end

您可以通读 commit's 描述以了解原因,也许看看您是否还有其他可以做的事情。

编辑

看看these lines也许attributes_typescolumns_hash可以解决你的问题。

方法 column_types 已在 Rails 5.

中删除

要获取列的类型,您可以尝试以下代码:

User.column_for_attribute('username').type

这将 return 类型,在您的情况下::string

您可以使用它来获取所有 column_types

的哈希值
User.columns_hash.each_with_object({}) { |obj, h| h[obj[1].name] = obj[1].sql_type }