Ruby on rails 在我的Rails数据库上运行迁移,悄悄地添加一列并随机删除一个表,而不会出现控制台错误
我只能通过缓慢地运行迁移来解决这个问题。在过去的两天里,我一直在尝试做一些简单的事情。从我的Ruby on rails 在我的Rails数据库上运行迁移,悄悄地添加一列并随机删除一个表,而不会出现控制台错误,ruby-on-rails,ruby,sqlite,migration,schema,Ruby On Rails,Ruby,Sqlite,Migration,Schema,我只能通过缓慢地运行迁移来解决这个问题。在过去的两天里,我一直在尝试做一些简单的事情。从我的simulations表中删除一列revolution:text,然后添加另一列:观点:hash 这样做会导致各种错误,例如没有方法“my_sym”和说模拟表不存在 我最初认为我通过以下方式解决了这个问题: rake db:drop rake db:schema:dump rake db:migrate VERSION="<Migration1>" rake db:migrate VERSIO
simulations
表中删除一列revolution:text
,然后添加另一列:观点:hash
这样做会导致各种错误,例如没有方法“my_sym”和说模拟表不存在
我最初认为我通过以下方式解决了这个问题:
rake db:drop
rake db:schema:dump
rake db:migrate VERSION="<Migration1>"
rake db:migrate VERSION="<Migration2>"
rake db:setup ENV="test"
这里特别关注的是:
# Could not dump table "simulations" because of following NoMethodError
# undefined method `[]' for nil:NilClass
有人能解释一下这里发生了什么,或者我如何解决它吗?我已经被困在这个问题上好几个小时了
有一件事可能值得注意,当我重新运行rakedb:schema:dump
时,出于某种原因,我也需要注释我的工厂,因为它们似乎会导致存在模拟表的错误。不知道为什么打电话给他们,只是觉得这些信息可能有用,他们都在这里:
FactoryGirl.define do
factory :simulation do |f|
f.id (Simulation.last.nil? ? 1 : Simulation.last.id + 1)
f.x_size 3
f.y_size 3
f.user_id 1
end
end
--
我认为问题就在这里:
class AddOpinionToSimulations < ActiveRecord::Migration
def change
add_column :simulations, :opinion, :hash
end
end
在schema.rb
文件中
如果您真的认为要在列中存储散列,您应该创建一个text
列:
add_column :simulations, :opinion, :text
然后在模型中使用:
serialize :opinion, Hash
当然,这会在数据库中留下一个不透明的YAML块,您无法(正常地)查询,因此只有在您同意的情况下才应该使用它
更好的解决方案是规范化您的
意见
散列,以便您可以将其信息存储在单独的表/模型中。此“散列”列类型是关于什么的?您真的要在数据库中存储序列化哈希吗?SQLite可以让您摆脱各种奇怪的事情,但是…有人告诉我,这里的哈希是一种有效的数据类型。看起来是散列迁移造成了问题。我该如何存储它呢?@muistooshort所以我只是将列创建为字符串并序列化了它。我希望这能解决我的问题。你能把散列的东西作为一个答案,这样我就可以批准它了。这几乎是你添加评论时提出的建议。不过,您可能需要进行一些手动清理。为意见创建特定列实际上是一个好主意。。只有三把钥匙,而且只有两把被使用,所以这不是个坏主意。再次感谢你把我从这个头痛的问题中解救出来。我倾向于假装serialize
不存在,这是一个导致严重问题的快速破解。单独的列或表是一种更好的方法。不相关,但我不能PM您-本着避免序列化的精神,您建议如何存储字符串的2d数组?这实际上取决于您希望如何在数据库中使用它。切换到PostgreSQL是一种选择吗?支持数组列的。有点超出了此项目的范围。我现在正在序列化为数组。。我真的不需要质疑它是一个较小的项目,我只是想知道是否有更好的设计选择。
# Could not dump table "simulations" because of following NoMethodError
# undefined method `[]' for nil:NilClass
FactoryGirl.define do
factory :simulation do |f|
f.id (Simulation.last.nil? ? 1 : Simulation.last.id + 1)
f.x_size 3
f.y_size 3
f.user_id 1
end
end
FactoryGirl.define do
factory :user do
email "user_#{User.last.nil? ? 1 : User.last.id + 1}@home.com"
password "password"
end
end
class AddOpinionToSimulations < ActiveRecord::Migration
def change
add_column :simulations, :opinion, :hash
end
end
t.hash :opinion
add_column :simulations, :opinion, :text
serialize :opinion, Hash