标签: rails-migrations

为什么我得到ActiveRecord :: Relation对象?

我试图从数据库中获取一个汽车实例,

theCar = Car.where(:name => 'TOYOTA')
puts theCar.user_name
Run Code Online (Sandbox Code Playgroud)

我收到了错误消息:ActiveRecord :: Relation的未定义方法`user_name':0xb6837b54

为什么我得到ActiveRecord :: Relation对象,而不是Car对象?可能是什么原因?顺便说一句,我在我的迁移文件中查询汽车.我正在使用Rails 3.

ruby-on-rails rails-migrations ruby-on-rails-3

5
推荐指数
1
解决办法
6408
查看次数

运行 LargeHadronMigrator add_column 期间出现 Mysql 错误“超出锁定等待超时;尝试重新启动事务”

我尝试解决在没有锁定的情况下在大型 MySQL 表上添加列的问题,并且在我的开发环境迁移中它可以工作。但是当我在生产环境中启动它时,应用程序引发了 MySQL 错误:

Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE competition_clients...
Run Code Online (Sandbox Code Playgroud)

这是我的迁移:

require 'lhm'

class AddPersonToCompetitionClients < ActiveRecord::Migration

  def up
    Lhm.change_table(:competition_clients, atomic_switch: false) do |m|
      m.add_column(:person_id, 'INT(12)')
      m.add_column(:active, 'TINYINT(1)')
      m.add_index([:person_id])
      m.add_index([:active])
    end
  end

  def down
    Lhm.change_table(:competition_clients, atomic_switch: false) do |m|
      m.remove_index([:person_id])
      m.remove_index([:active])
      m.remove_column(:person_id)
      m.remove_column(:active)
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

有没有人遇到同样的问题,或者有没有人有解决方案如何运行迁移而不从主应用程序引发异常?

ruby-on-rails rails-migrations

5
推荐指数
1
解决办法
2万
查看次数

Rails 迁移突然创建看似随机的具有不同字符集的表

我们使用 Rails(版本 2.3.8,Ruby 版本 1.8.7,如果相关的话)已经有一段时间了,一切似乎都工作正常。我们的 MySQL 版本 5.5.20 DBMS 中的所有表都使用默认的 latin-1 字符集,我认为这很好,因为我们没有国际用户(尽管我们的 database.yml 实际上指定了 utf8...没有人注意到数据库之前实际上并没有这样出来)。

然而我刚刚发现,对于我们最后一个应用程序之一,该特定数据库中的表正在使用 utf8。我们现在正在添加到这个应用程序,并且在我们的开发机器和测试服务器上,新创建的表最终使用的字符集似乎是完全随机的。周五,我部署到我们的测试服务器,当时创建了两个表,其中一个使用 latin-1,另一个使用 utf8。在我的机器上它们都是 utf8。由于我们在这些表之间使用外键,所以这是一个问题。

我发现了大量有关修复字符集问题从一种字符集迁移到另一种字符集等的信息,但没有任何信息可以解释为什么我们会突然遇到这个问题,以及为什么它会来回切换。

两个表的迁移是

create_table :charges, :id => false do |t|
  t.string :id
  t.decimal :amount
  t.decimal :charge
  t.text :description
  t.string :charge_type_ref_id
  t.string :business_id

  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

create_table :charge_type_refs, :id => false do |t|
  t.string :id
  t.string :name
  t.string :code
  t.boolean :active
  t.decimal :fee

  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

我们的database.yml看起来像

development:
adapter: mysql
encoding: utf8
reconnect: false
database: database_development
pool: 5
username: …
Run Code Online (Sandbox Code Playgroud)

mysql ruby-on-rails character-encoding rails-migrations

5
推荐指数
1
解决办法
3389
查看次数

向现有表添加非空列的问题

我在向表中添加不可为空的列时遇到问题.我读了很多关于这个的帖子,它应该是正确的.

迁移代码:

  def change
    add_column :individual_trainings, :start_on, :time
    add_column :individual_trainings, :end_on, :time

    change_column_null :individual_trainings, :start_on, false
    change_column_null :individual_trainings, :end_on, false
  end
Run Code Online (Sandbox Code Playgroud)

错误:

PG::NotNullViolation: ERROR:  column "start_on" contains null values...
Run Code Online (Sandbox Code Playgroud)

我不知道为什么不工作.我该如何纠正写改变方法?

提前致谢.

更新:这是我的大错.我在这张桌子上有一条记录......我清理桌子并迁移.现在它正在运作.对不起我的愚蠢和浪费你的时间.

ruby postgresql ruby-on-rails rails-migrations

5
推荐指数
2
解决办法
4024
查看次数

迁移不回滚

我已经运行了这个迁移:

class AddUniqueToLocationColumnName < ActiveRecord::Migration
  def change
    remove_index :locations, :name
    add_index :locations, :name, unique: true
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试回滚,但显示错误:

标准错误:发生错误,此迁移和所有后续迁移均已取消:remove_index 仅在给定 :column 选项时才可逆。

如何将此迁移回滚到我以前的版本?

ruby-on-rails rollback rails-migrations

5
推荐指数
1
解决办法
2692
查看次数

升级到Rails 4.2.6:rake db:将插入列限制迁移到schema.rb中

我发现很多我们的列limit: xxx在迁移中没有突然限制应用于列,而不是数据库本身,而是在我们的db/schema.rb文件中.当我们在任何环境中进行迁移时,这并不可怕.它变得麻烦的地方是我们设置新数据库时 - 它们不再匹配我们在各种prod/staging/qa环境中的数据库.

我需要找到一种不会发生这种情况的方法.

随着时间的推移我们添加一个迁移,我们最终不得不做一个非常复杂和乏味的git add -p db/schema.rb事情,随着时间的推移,我失去了对我们的db/schema.rb文件与任何版本的现实相匹配的信心.

作为一个数据点,如果我在rake db:migrate没有新的迁移的情况下运行,db/schema.rb将被重建,并且具有极其庞大的差异.

ruby-on-rails rails-migrations ruby-on-rails-4.2

5
推荐指数
1
解决办法
730
查看次数

Rails迁移将列类型从文本更改为json(Postgresql)

我一直在努力将Postgres数据库中的列类型从text更改为json.这是我试过的......

class ChangeNotesTypeInPlaces < ActiveRecord::Migration[5.0]
  def up
    execute 'ALTER TABLE places ALTER COLUMN notes TYPE json USING (notes::json)'
  end

  def down
    execute 'ALTER TABLE places ALTER COLUMN notes TYPE text USING (notes::text)'
  end
end
Run Code Online (Sandbox Code Playgroud)

也...

class ChangeNotesTypeInPlaces < ActiveRecord::Migration[5.0]
  def up
    change_column :places, :notes, 'json USING CAST(notes AS json)'
  end

  def down
    change_column :places, :notes, 'text USING CAST(notes AS text)'
  end
end
Run Code Online (Sandbox Code Playgroud)

这两个都返回相同的错误......

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type json
Run Code Online (Sandbox Code Playgroud)

postgresql ruby-on-rails rails-migrations

5
推荐指数
2
解决办法
5048
查看次数

当列与表不匹配时,如何可逆地删除表上的remove_foreign_key?

我尝试了以下

remove_foreign_key :users, :asset_types, column: :seek_asset_type_id
Run Code Online (Sandbox Code Playgroud)

但是得到了错误

StandardError:发生错误,此错误和所有后续迁移
均被取消:参数数量错误(给定3个,预期值为1..2)

文档说它使用与相同的选项#add_foreign_key

文献资料

该列以前是用

add_reference :users, :seek_asset_type, foreign_key: {to_table: :asset_types}
Run Code Online (Sandbox Code Playgroud)

这是定义:

"fk_rails_4dcaa1c59c" FOREIGN KEY (seek_asset_type_id) REFERENCES asset_types(id)
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-migrations ruby-on-rails-5

5
推荐指数
1
解决办法
483
查看次数

Rails错误:运行rails db:migrate时,表'...'上的索引名称'...'已经存在

因此,我正在与一位同事合作,该同事添加了一些其他迁移文件,并且在按正常程序提取版本后,我运行了rails db:migrate。我最终收到以下错误:

 Index name 'index_authorizations_on_user_id' on table 'authorizations' already exists

 ArgumentError: Index name 'index_authorizations_on_user_id' on table 'authorizations' already exists
Run Code Online (Sandbox Code Playgroud)

因此,我去检查了架构,该表已经存在。那为什么会失败呢?通常,过去在迁移时,它仅生成新的表条目/更新,所以为什么不忽略它呢?

我尝试进行回滚并获取:此迁移使用remove_columns,它不是自动可逆的。

我试着做bin / rails db:migrate RAILS_ENV = development并且遇到相同的错误。

我已经完成了db:reset和db:drop,这一切又回到了我无法运行的未决迁移问题。我究竟做错了什么?

他们添加了以下迁移:20171024074328_create_authorizations.rb

 class CreateAuthorizations < ActiveRecord::Migration[5.1]
  def change
    create_table :authorizations do |t|
      t.string :provider
      t.string :uid
      t.references :user, foreign_key: true

      t.timestamps

      add_index :authorizations, :user_id
      add_index :authorizations, [:provider, :uid], unique: true
    end
  end
Run Code Online (Sandbox Code Playgroud)

结束

postgresql ruby-on-rails rails-migrations rails-activerecord

5
推荐指数
1
解决办法
3823
查看次数

如何使用 Rails 在 PostgreSQL 中将时间列更改为整数列?

我在连接到新 Rails 应用程序的 PostgreSQL 数据库中命名duration的表中有一个列time_entries。它目前被格式化为时间数据,但我希望它是一个整数。(具体来说,我要使用 smallint 列,因为它将是不超过一天的分钟数,即 1440。)

首先,我试过:

change_column :time_entries, :duration, :smallint, limit: 2
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

PG::DatatypeMismatch: ERROR:  column "duration" cannot be cast automatically to type smallint
HINT:  You might need to specify "USING duration::smallint".
Run Code Online (Sandbox Code Playgroud)

然后,在看了这篇文章这篇文章之后,我尝试了以下迁移:

change_column :time_entries, :duration, 'integer USING CAST(duration AS integer)'
change_column :time_entries, :duration, :smallint, limit: 2
Run Code Online (Sandbox Code Playgroud)

但是第一行返回了以下错误:

PG::CannotCoerce: ERROR:  cannot cast type time without time zone to integer
Run Code Online (Sandbox Code Playgroud)

我如何让它转换?时区无关紧要,因为它实际上表示一段时间。我是一个 Rails 新手,对原始 SQL 代码一无所知。谢谢!

postgresql casting ruby-on-rails rails-migrations ruby-on-rails-4

5
推荐指数
1
解决办法
1159
查看次数