Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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 如何使用change\u列为rails迁移postgres中的hstore生成正确的sql_Ruby On Rails_Postgresql_Hstore - Fatal编程技术网

Ruby on rails 如何使用change\u列为rails迁移postgres中的hstore生成正确的sql

Ruby on rails 如何使用change\u列为rails迁移postgres中的hstore生成正确的sql,ruby-on-rails,postgresql,hstore,Ruby On Rails,Postgresql,Hstore,我需要让hstore在rails迁移中工作。我已经通过迁移启用了hstore,现在,我正在尝试生成正确的sql以使其正常工作,但当我运行db:migrate时,我会出现此错误 C:\Sites\Peoples_Profiles>rails db:migrate rails aborted! SyntaxError: C:/Sites/Peoples_Profiles/db/migrate/20180407073155_add_hstore_hash_to_urls.rb:4: syntax

我需要让hstore在rails迁移中工作。我已经通过迁移启用了hstore,现在,我正在尝试生成正确的sql以使其正常工作,但当我运行db:migrate时,我会出现此错误

C:\Sites\Peoples_Profiles>rails db:migrate
rails aborted!
SyntaxError: C:/Sites/Peoples_Profiles/db/migrate/20180407073155_add_hstore_hash_to_urls.rb:4: syntax error, unexpected '\n', expecting =>
C:/Sites/Peoples_Profiles/db/migrate/20180407073155_add_hstore_hash_to_urls.rb:10: syntax error, unexpected end-of-input, expecting keyword_end
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
所以我认为postgres在抱怨,因为它试图转换这个代码

所以在检查rails如何实际引入参数后,它看起来是这样的

 ["urls", "--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nurl1: http://hello\nurl2: http://jack\nurl3: http://boo\nurl4: ''\nurl5: ''\n"]
不确定是否在数据库中看起来像这样,但我说有一个\n在那里导致了这个错误。我们必须进一步跟进


。。。我现在意识到\n将来自将散列序列化为YAML的转换。

尝试将SELF.DOWN更改为SELF.ANNUAL
我认为它会解决问题,大概你从以下几点开始:

serialize :urls
在您的模型中,因此您的散列将作为YAML存储在数据库中。没有从YAML文本到
hstore
的类型转换,因此您可以使用:

USING urls::hstore
不行。在PostgreSQL中没有可靠解析YAML的简单方法,因此您最好的选择是:

  • users.url
    列重命名为
    users.yaml\u url
  • 添加一个新的
    url
    列,其中(最好)包含
    jsonb
    类型,但如有必要,您可以使用
    hstore
    jsonb
    是未来的发展趋势,今后将得到更好的支持
  • 将数据库中的每个
    yaml\u URL
    值读入Ruby
  • 使用
    h=YAML.load(YAML\u from\u db)
    将该YAML字符串转换为散列
  • 将散列编码为JSON(
    h.to_JSON
    )并将其放回数据库
  • 如果需要,使
    url
    不为空,并删除
    yaml\u url
  • 我建议对此使用低级别,因为您不想让ActiveRecord的内容碍事,您能在
    ApplicationRecord.connection.raw\u connection
    中找到这样的连接吗。我这样说是因为您不希望数据迁移以任何方式与模型交互,并且低级接口支持占位符,因此可以避免转义和引用问题


    该过程假设您没有那么多数据,或者,在修复数据库时,您的应用程序可以脱机。如果不是这样的话,那么您需要在修复数据时维护这两种格式(添加一个新的
    jsonb
    列,在调用
    url
    url=
    时在模型内部写入和读取这两种格式),然后稍后进行清理。

    并且您没有关闭行(参见第4行)你是什么意思?我不认为你需要关闭这行,我认为rails会自动关闭..我将尝试创建一个表,看看它是否刚刚迁移过来..好的,如果我这样做,
    add_column:users,:urlss,:hstore,default:{},null:false
    并添加一个新的列,它可以工作,所以我认为它在更改和转换格式时有问题,所以你说我可以使用pg gem或
    ApplicationRecord.connection.raw\u connection
    我在这方面找不到任何东西。我已经安装了pg gem。你说我可以在建立连接后运行所有这些代码。然后将我的ruby与sql混合以获得结果?您可以在
    ApplicationRecord.Connection.raw_Connection
    中找到
    PG::Connection
    ,或者在迁移中只找到
    Connection.raw_Connection
    。我在答案中链接到了
    pg
    文档。然后,您必须使用SQL(获取数据并将新数据放回)和Ruby(解码YAML并编码为JSON)的组合,一行一行地手动修复所有问题。是的,这是一个丑陋的过程,但它是使用
    序列化
    的必然结果。
    serialize :urls
    
    USING urls::hstore