Rails 5.1.5:TypeError:无法强制转换ActiveRecord :: ConnectionAdapters :: PostgreSQL :: OID :: Array :: Data

时间:2018-03-22 20:10:14

标签: ruby-on-rails ruby postgresql activerecord rails-activerecord

当我尝试通过Rails控制台更新ROLLBACK对象的Puzzle对象时,我在开发中遇到了这个错误的数据库User

TypeError: can't cast ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array::Data

只有当我尝试在update之后使用save(或puzzle.user = some_user)时才会发生这种情况。添加初始所有者提交没有问题的数据库。

以下是架构中的模型:

create_table "users", force: :cascade do |t|
  t.string "username"
  t.string "password_digest"
  t.string "email"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer "location_id"
end

create_table "puzzles", force: :cascade do |t|
  t.string "name"
  t.integer "pieces"
  t.integer "missing_pieces"
  t.string "previous_owners", array: true
  t.integer "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

到目前为止,这是puzzle.rbuser.rb个文件:

class User < ApplicationRecord
    validates :username, presence: true
    validates :email, presence: true#, uniqueness: true
    # use bcrypt for password security
    has_secure_password

    has_many :puzzles
    has_many :reviews
    belongs_to :location
end

class Puzzle < ApplicationRecord
    validates :name, uniqueness: true
    validates :pieces, presence: true, numericality: { only_integer: true }

    belongs_to :user
    has_many :puzzle_tags
    has_many :tags, through: :puzzle_tags
    has_many :reviews
    delegate :location, to: :user
end

知道可能导致这个问题的原因吗?

***请注意:我是新手并且第一次使用PostgreSQL。我特意选择Postgres作为我的开发数据库而不是SQLite3,因为它允许使用数组数据类型。谢谢!

1 个答案:

答案 0 :(得分:2)

您将previous_owners设置为字符串数组,但是您将整数推入其中。 ActiveRecord擅长将字符串转换为整数,反之亦然,但从Rails 5.1.5开始,该功能在数组字段中不起作用。

尝试使用迁移将字段更改为整数数组。你需要这样做:

$ rails g migration change_previous_owners_to_integer_array

然后编辑生成的迁移文件,如下所示:

def change
  remove_column :puzzles, :previous_owners, :string, array: true
  add_column :puzzles, :previous_owners, :integer, array: true
end