Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在我的Rails数据库上运行迁移,悄悄地添加一列并随机删除一个表,而不会出现控制台错误_Ruby On Rails_Ruby_Sqlite_Migration_Schema - Fatal编程技术网

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